Oracle primary key和unique key的區(qū)別與聯(lián)系 |
發(fā)布時(shí)間: 2012/9/13 17:14:27 |
primary key與unique key都是唯一性約束。但二者有很大的區(qū)別: 1.作為primary key的1個(gè)或多個(gè)列必須為NOT NULL, 如果建表時(shí)此列設(shè)為NULL,在增加PRIMARY KEY時(shí),列自動(dòng)更改為NOT NULL。 而unique key約束的列可以為null,這是primary key與unique key最大的區(qū)別。 2.一個(gè)表只能有一個(gè)primary key(單列或多列,多列主鍵叫聯(lián)合主鍵),但可以有多個(gè)unique key。 實(shí)例1: create table t(c1 number(2),c2 date,c3 varchar2(5),c4 int); desc t; Name Type Nullable Default Comments ---- ----------- -------- ------- -------- C1 NUMBER(2) Y C2 DATE Y C3 VARCHAR2(5) Y C4 INTEGER Y // 實(shí)例2:添加primary key alter table t add constraint t_pk primary key(c1,c2); desc t; Name Type Nullable Default Comments ---- ----------- -------- ------- -------- C1 NUMBER(2) C2 DATE C3 VARCHAR2(5) Y C4 INTEGER Y 我們看到,將c1,c2列設(shè)為聯(lián)合主鍵后,他們變?yōu)閚ot null; 如果在建表時(shí)就指定了主鍵的話,主鍵列將會(huì)默認(rèn)為not null。 // 如果我們?cè)谔砑右粋(gè)primary key,那么我們將會(huì)得到一個(gè)錯(cuò)誤: alter table t add constraint t_pk_2 primary key(c3,c4) ORA-02260: table can have only one primary key // 實(shí)例3:添加unique key alter table t add constraint unique_key_t unique(c3,c4); 實(shí)例4:添加數(shù)據(jù) insert into t(c1,c2,c3,c4) values(10,sysdate,'abc',3); 1 row inserted // insert into t(c1,c2,c3,c4) values(11,sysdate,'abc',3); ORA-00001: unique constraint (SCOTT.UNIQUE_KEY_T) violated 我們看到,添加的第二條數(shù)據(jù)違反了剛剛創(chuàng)建的唯一鍵約束; 將unique_key_t刪除,添加就能成功了。 實(shí)例5:刪除unique key alter table t drop constraint unique_key_t; insert into t(c1,c2,c3,c4) values(11,sysdate,'abc',3); 1 row inserted // 實(shí)例6:刪除primary key alter table t drop constraint t_pk; Table altered // desc t; Name Type Nullable Default Comments ---- ----------- -------- ------- -------- C1 NUMBER(2) Y C2 DATE Y C3 VARCHAR2(5) Y C4 INTEGER Y 刪除主鍵約束后,c1,c2列由恢復(fù)了原來(lái)的默認(rèn)值null。 // 3.其實(shí)primary key也是unique key,被primary key約束的列not null,并且不允許重復(fù) 實(shí)例7: truncate table t; Table truncated // alter table t add constraint t_pk primary key(c1,c2); Table altered // insert into t(c1,c2,c3,c4) values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10); 1 row inserted // insert into t(c3,c4) values('china',1); ORA-01400: cannot insert NULL into ("SCOTT"."T"."C1") // insert into t(c1,c2,c3,c4) values(1,to_date('2011-01-01','yyyy-mm-dd'),'csdn',10); ORA-00001: unique constraint (SCOTT.T_PK) violated 這里,我們看到primary key t_pk變成了unique約束,證明了主鍵約束也是唯一約束。 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |