如何为列创建具有预先指定值的表。
类似的东西enum
,但不是enum
,因为它适用于 8.3 Postgres
,我需要一些适用于 8.1 及更高版本的东西。
例如
CREATE TABLE (
cars ('bmw', 'audi');
)
而且在向汽车列插入值时,我应该无法插入除 bmw 和 audi 之外的任何其他内容。
如何为列创建具有预先指定值的表。
类似的东西enum
,但不是enum
,因为它适用于 8.3 Postgres
,我需要一些适用于 8.1 及更高版本的东西。
例如
CREATE TABLE (
cars ('bmw', 'audi');
)
而且在向汽车列插入值时,我应该无法插入除 bmw 和 audi 之外的任何其他内容。
我认为您正在寻找的是CHECK
约束。
create table mydata(
cars char(4)CONSTRAINT limit_cars_to CHECK (cars in ('bmw', 'audi'))
);
insert into mydata values('bmw'); /*this insert works*/
insert into mydata values('xxx');/*this insert fails msg: ERROR: new row for relation "mydata" violates check constraint "limit_cars_to": insert into mydata values('xxx')
*/
我已经用 PostgreSQL 8.3 对此进行了测试(因为那是 SQL Fiddle 上可用的)。可能只适用于 PostgreSQL 8.1。试试看。
资料来源:http ://www.postgresql.org/docs/8.1/static/ddl-constraints.html
有两种方法可以解决这个问题。
第一种是使用检查约束,Sashikanth 的回答对此进行了描述。如果允许值不变,则应使用此方法。如果它们确实发生了变化,您需要更新在许多组织中可能需要很长时间才能投入生产的约束。
第二种是对另一个列出允许值的表使用外键:
create table cars (
car varchar(10) primary key
);
create table mydata (
id serial primary key,
car varchar(10) references cars
);
如果您希望值发生变化,或者用户需要能够添加值,则应使用此方法。