8.3以降のPostgreSQLは列挙型を認識しています。
簡単な質問:8.2(.9)もそれらを知っていますか?そうでない場合、代替品として何を使用できますか?
8.3以降のPostgreSQLは列挙型を認識しています。
簡単な質問:8.2(.9)もそれらを知っていますか?そうでない場合、代替品として何を使用できますか?
列挙型は8.2ではサポートされていません。
別の方法として、可能な値をリストするテーブルへtext
の参照を含む列を使用します。foreign key
CREATE TABLE fruit_enum (
fruit text primary key
);
INSERT INTO fruit_enum(fruit) VALUES
('apple'),('pear'),('grape');
CREATE TABLE basket (
-- ... blah columns ...
fruit text,
-- ... blah columns ...
CONSTRAINT fruit_fk FOREIGN KEY (fruit) REFERENCES fruit_enum(fruit)
);
enum
これは古典的な関係の定式化であり、とにかく使用するよりも通常は好ましいです。一部のクライアントアプリケーションから列挙を処理するのは面倒であり、Pgは現在それらからの値の削除もサポートしていません。
上記の仕組みは次のとおりです。
regress=# INSERT INTO basket(fruit) VALUES ('apple');
INSERT 0 1
regress=# INSERT INTO basket(fruit) VALUES ('cider');
ERROR: insert or update on table "basket" violates foreign key constraint "fruit_fk"
DETAIL: Key (fruit)=(cider) is not present in table "fruit_enum".
regress=#
必要に応じて、整数IDを介して列挙を間接化できます。外部キーは、列挙値ではなく、列挙テーブルのIDに対するものです。個人的には、その方法の真の「列挙」にすぎないにもかかわらず、私はそのアプローチのファンではありません。値を取得するには常に高価なJOIN
サブクエリが必要であり、通常はスペースがほとんど節約されないためです。
あるいは、@ a_horse_with_no_nameが指摘したように、単純なCHECK
制約で十分なことがよくあります。
CREATE TABLE basket (
-- ... blah columns ...
fruit text,
-- ... blah columns ...
CONSTRAINT fruit_in_allowed_list CHECK (fruit IN ('apple', 'pear', 'grape'))
);
外部キーアプローチと同様に(ただし列挙型とは異なり)、これはSQL標準であり、どのデータベースでも機能するはずです。
また、真剣に、8.2?それは寿命の終わりであり、ひどく、驚くほど時代遅れです。緊急のアップグレード計画を立てます。
列挙型は8.3で導入されまし
た。リリースノートは次のとおりです。http ://www.postgresql.org/docs/8.3/static/release-8-3.html
8.2のデータ型はここに文書化されています:http ://www.postgresql.org/docs/8.2/static/datatype.html
しかし、とにかく8.2を使用するべきではありません(実際には、8.3もお勧めしません)