Oracle primary key和unique key的區(qū)別與聯(lián)系 |
發(fā)布時間: 2012/8/20 18:04:48 |
•primary key與unique key都是唯一性約束。但二者有很大的區(qū)別: •1.作為primary key的1個或多個列必須為NOT NULL, • 如果建表時此列設(shè)為NULL,在增加PRIMARY KEY時,列自動更改為NOT NULL。 • 而unique key約束的列可以為null,這是primary key與unique key最大的區(qū)別。 •2.一個表只能有一個primary key(單列或多列,多列主鍵叫聯(lián)合主鍵),但可以有多個unique key。 •實例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 •// •實例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; •如果在建表時就指定了主鍵的話,主鍵列將會默認為not null。 •// •如果我們在添加一個primary key,那么我們將會得到一個錯誤: •alter table t add constraint t_pk_2 primary key(c3,c4) •ORA-02260: table can have only one primary key •// •實例3:添加unique key •alter table t add constraint unique_key_t unique(c3,c4); •實例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刪除,添加就能成功了。 •實例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 •// •實例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列由恢復了原來的默認值null。 •// •3.其實primary key也是unique key,被primary key約束的列not null,并且不允許重復 •實例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約束,證明了主鍵約束也是唯一約束。 本文出自:億恩科技【www.allwellnessguide.com】 |