2011-08-30 10 views
30

テキスト値「レッスン」または「クイズ」を許可するテーブル(discussionと呼ばれる)に列element_typeを作成したいが、その列に他の値が挿入されているとエラーが発生する。Postgresでは、特定の列の可能な値をどのように制限しますか?

は、私が列element_id(主キー、int型)とelement_type(ユニーク、テキスト)とelement_typesと呼ばれる別のテーブルを作成し、element_typesの列element_idを参照するテーブルdiscussionに外部キーforeign_element_idを作成することができることを理解しています。あるいは、私はelement_idを完全に忘れて、element_typeをプライマリキーとして設定するだけです。しかし、私は新しいテーブルを作成しないようにしたい。

新しいテーブルを作成せずに列の値を制限する方が簡単ですか?

+0

をお楽しみください!彼らは特に高価ではありません。 – SingleNegationElimination

+2

私の場合は非常に頻繁に起こりうる値を制限したいときは、不要な乱雑さほどテーブルのコストが高くありません。 –

答えて

57

IMOクリーナーオプションはENUMを作成することですが、あなたはCHECK CONSTRAINT:

ALTER TABLE distributors 
    ADD CONSTRAINT check_types 
    CHECK (element_type = 'lesson' OR element_type = 'quiz'); 

を追加することができます。誰かが持つ行を挿入または更新しようとするたび

CREATE TYPE element_type AS ENUM ('lesson', 'quiz'); 
+11

優れています。ありがとうございました。私のようにPostgresの新機能である可能性がある他の人のメモとして、CREATE TYPEは、intやtextなどの他の型として使用されるユーザ定義型を作成します。この場合、次のようになります。 'CREATE TYPE element_typeをENUM( 'lesson'、 'quiz')とします。 CREATE TABLEの説明 ( type_of_element element_type; ); ' –

1

このトリガーが例外をスロー無効なelement_typeです。

CREATE OR REPLACE FUNCTION check_discussion_element_type() RETURNS TRIGGER AS $$ 
DECLARE new_element_type varchar(25); 
BEGIN 
    SELECT element_type into new_element_type 
     FROM discussion 
     WHERE discussion.element_id = NEW.element_id; 

    IF new_element_type != 'lesson' AND new_element_type != 'quiz' 
     THEN RAISE EXCEPTION 'Unexpected discussion type'; 
    END IF; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 
create trigger t_check_discussion_element_type after update or insert on discussion for each row execute procedure check_discussion_element_type(); 

ハードコードされたタイプを削除する場合は、新しいタイプがタイプテーブルに存在するかどうかを確認するために修正することができます。

+1

チェック制約またはENUMと比較して、非常に遅く複雑な解決策です。 –

16

shorcutの構文は次のとおりです。

ALTER TABLE distributors 
    ADD CONSTRAINT check_types 
    CHECK (element_type IN ('lesson', 'quiz')); 

これはにautomaticolly翻訳:

CONSTRAINT check_types CHECK (element_type::text = ANY (ARRAY['lesson'::character varying, 'quiz'::character varying)) 

あなたがテーブルを作成しないようにしたいなぜ;-)

関連する問題