8.3的PostgreSQL知道Enumerated Types。
简单的问题:8.2(.9)也知道吗?如果没有,可以用什么代替?
答案 0 :(得分: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 ?那是end-of-life而且可悲,令人惊讶地过时了。制定紧急升级计划。
答案 1 :(得分:1)
Enum在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)