PostgreSQL 8.2.9枚举类型

时间:2012-09-18 14:07:57

标签: sql postgresql enums postgresql-8.2

8.3的PostgreSQL知道Enumerated Types

简单的问题:8.2(.9)也知道吗?如果没有,可以用什么代替?

2 个答案:

答案 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)