2013-10-01 28 views
0

如何使用列的預先指定值創建表。列的指定值

類似於enum,但不是enum,因爲它的工作原理是8.3 Postgres,我需要與8.1及更高版本一起工作。

例如

CREATE TABLE (
    cars ('bmw', 'audi'); 
) 

而且我不應該能夠插入值到汽車列時插入其他任何東西,除了寶馬和奧迪。

+0

請在'tags'中添加數據庫引擎。不要把它標記爲'SQL'。這意味着你使用'POSTGRES',但這是外人看不到的。 –

+1

8.1已經過時* *已過時。你應該真的打算升級到現在的版本(例如9.3)***現在***。 –

回答

2

我認爲你要找的是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

+1

CHECK在8.1中應該沒問題。但是,該版本在2010年標誌着生命週期結束。很快升級。 http://www.postgresql.org/support/versioning/ –

0

有兩種方法來解決這個問題。

第一個是使用檢查約束,Sashikanth的回答描述了它。 如果允許值不更改,則應使用此方法。如果他們改變了,你需要更新許多組織可能需要很長時間才能投入生產的約束條件。

二是使用外鍵到另一個表格,列出了允許值:

create table cars (
    car varchar(10) primary key 
); 

create table mydata (
    id serial primary key, 
    car varchar(10) references cars 
); 

如果你期望的值發生變化,或這種做法應該被使用,如果用戶需要能夠添加值。