2016-11-14 10 views
0

私はPSQLを使用していますが、REQ_TYPE列とRESP_STATUS列を持つテーブルを作成しようとしています。そして、私はテーブルの無効なエントリを避けるためにENUMに行くことに決めました。PSQLのINTEGER列にENUMを作成できますか?

このクエリを使用してREQ_TYPEのENUMを正常に作成しました。

CREATE TYPE RequestType AS ENUM('GET','POST','PUT','DELETE','PATCH');

しかし、私は以下のクエリ、

CREATE TYPE ResponseStatus AS ENUM(200,201,202,204,301,302,304,400,401,403,404,405,413,415,429,500);

をしようとしたときRESP_STATUSのために、私は私が

CREATE TYPE ResponseStatus AS ENUM('200','201','202');

が解決するだろうことを確信している応答

ERROR: syntax error at or near "200"

を得ました私の問題。しかし、私はRESP_STATUSをINTEGERとして保持したいだけです。

INTEGERでENUMを作成できますか?はいの場合、どうですか?

答えて

1

enumは、それ自身に等しい任意のラベルのセットです。彼らは特定のタイプの値に対する制約ではありません。型定義内の文字列は、実際の値よりも列名やプログラミング言語の定数に似ていると考えてください。

あなたが代わりにあなたが許可された値のリストを効果的に「サブタイプ」整数にできるようになるこれは、(documentation for CREATE DOMAINを参照)ドメインを探している可能性があります:

CREATE DOMAIN http_status AS integer 
CHECK (
    VALUE IN 
    (200,201,202,204,301,302,304,400,401,403,404,405,413,415,429,500) 
) 

しかし、Mike Sherrill's answerで提案されているように、 HTTPステータスに関する

  • 詳細を保存する例えばdescription、(:これが許す限り、外部キー制約は、既知のHTTPステータスコードのリストを指していると、通常の整数列を使用する方が適切かもしれません、is_redirect
  • 新しいHTTPステータスは、例えば、あなたは多くの言語であなたの例から410 GONE417 Expectation Failed
1

いいえ、一連の整数に対してENUMを作成することはできません。あなたが整数のENUMを望む理由reading the fine manual

Enum types take a list of one or more quoted labels

から私は測深することはできません。 CHECK制約、または有効な整数の表への外部キー参照のいずれかで、整数を直接使用します。

ターゲットと思われるHTTPステータスコードの場合、HTTPステータスコードとその意味のテーブルへの外部キー参照は非常に意味があります。

+0

を逃している(より簡単に追加することが、列挙型のエントリは、ラベルと値の両方を持っています;私はこれがOPが期待していたものだと思う。例えば、Cでは 'enum STATUS {OK = 200、NOT_FOUND = 404}'などと書くことができます。あるいは、 "ドメイン"に近いものを考えています。私はあなたの結論に同意します、しかし、このケースでは外部キーがより適切です。 – IMSoP

関連する問題