wns*_*mth 2 sql postgresql enums postgresql-8.2
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)
);
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?那是生命的终结,可悲的是,令人惊讶地过时了.制定紧急升级计划.
| 归档时间: |
|
| 查看次数: |
971 次 |
| 最近记录: |