2

8.3以降のPostgreSQLは列挙型を認識しています。

簡単な質問:8.2(.9)もそれらを知っていますか?そうでない場合、代替品として何を使用できますか?

4

2 に答える 2

5

列挙型は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?それは寿命の終わりであり、ひどく、驚くほど時代遅れです。緊急のアップグレード計画を立てます。

于 2012-09-18T14:31:01.920 に答える
1

列挙型は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もお勧めしません)

于 2012-09-18T14:13:38.560 に答える