PostgreSQL 8.2.9枚举类型

wns*_*mth 2 sql postgresql enums postgresql-8.2

8.3中的PostgreSQL知道枚举类型.

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

Cra*_*ger 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)
);
Run Code Online (Sandbox Code Playgroud)

这是经典的关系式,通常优于使用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=# 
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以通过整数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'))
);
Run Code Online (Sandbox Code Playgroud)

像外键方法(但不像枚举)这是SQL标准,应该适用于任何数据库.

还有,说真的,8.2?那是生命终结,可悲的是,令人惊讶地过时了.制定紧急升级计划.