如何使用列的預先指定值創建表。列的指定值
類似於enum
,但不是enum
,因爲它的工作原理是8.3 Postgres
,我需要與8.1及更高版本一起工作。
例如
CREATE TABLE (
cars ('bmw', 'audi');
)
而且我不應該能夠插入值到汽車列時插入其他任何東西,除了寶馬和奧迪。
如何使用列的預先指定值創建表。列的指定值
類似於enum
,但不是enum
,因爲它的工作原理是8.3 Postgres
,我需要與8.1及更高版本一起工作。
例如
CREATE TABLE (
cars ('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小提琴上的可用標準)。可能只是使用PostgreSQL 8.1。試一試。
來源:http://www.postgresql.org/docs/8.1/static/ddl-constraints.html
CHECK在8.1中應該沒問題。但是,該版本在2010年標誌着生命週期結束。很快升級。 http://www.postgresql.org/support/versioning/ –
有兩種方法來解決這個問題。
第一個是使用檢查約束,Sashikanth的回答描述了它。 如果允許值不更改,則應使用此方法。如果他們改變了,你需要更新許多組織可能需要很長時間才能投入生產的約束條件。
二是使用外鍵到另一個表格,列出了允許值:
create table cars (
car varchar(10) primary key
);
create table mydata (
id serial primary key,
car varchar(10) references cars
);
如果你期望的值發生變化,或這種做法應該被使用,如果用戶需要能夠添加值。
請在'tags'中添加數據庫引擎。不要把它標記爲'SQL'。這意味着你使用'POSTGRES',但這是外人看不到的。 –
8.1已經過時* *已過時。你應該真的打算升級到現在的版本(例如9.3)***現在***。 –