2012-03-09 71 views
1

我創建一個表在數據庫中設置預先定義的值列

create tabel xyz 
(id number (10) not null, 
    code char(1) , 

primary key (id) 
) 

我希望用戶對代碼柱像P,S,C 如何做到這一點預設值? 目前我正在使用代碼字符(1)默認('P','S','C') 但與此我得到錯誤。 請建議和我也想此列不空...

回答

0

如果需要顯示這些值的用戶,可能最容易創建另一個表,並使用外鍵引用。你可能實現這個作爲強制執行CHECK約束的dbms中的CHECK約束,但向用戶呈現有效的選擇會很麻煩。

-- You'll want to restrict permissions on this table pretty tightly. Very few 
-- people should be allowed to change it. 
create table xyz_codes (
    code char(1) primary key CHECK (code in ('P', 'S', 'C')) 
); 

insert into xyz_codes values ('P'), ('S'), ('C'); 

create table xyz ( 
    id integer primary key, 
    code char(1) references xyz_codes (code) 
); 

完成該操作後,下面的INSERT語句將會因外鍵違例而失敗。

insert into xyz values (1, 'D'); 

但是這個會成功。

insert into xyz values (1, 'C'); 

要選擇演示文稿有效的選擇給用戶,使用

select code 
from xyz_codes 
order by code; 
1

ENUM列類型是容易的,但可以回來困擾你。我建議增加一個「查找」表,將房子你所說的,然後添加一個「value_id」列到你的主要目標表中的值,是這樣的:

primary_table: 
    id 
    value_id 

value_table: 
    id: 
    name: #P, S, C 

如果你的表是大,你需要更改任何枚舉值,您將不得不在表上運行一個更改,這可能意味着顯着的停機時間。

+0

你會讓「value_table.name」是唯一的嗎? – 2014-02-13 16:49:25

+1

@RafaelBarros:雅,我爲我所有的查找表添加唯一的鍵。 – 2014-02-13 17:21:48

相關問題