Oracle primary key和unique key的区别与联系 |
发布时间: 2012/8/20 18:04:48 |
•primary key与unique key都是唯一性约束。但二者有很大的区别: •1.作为primary key的1个或多个列必须为NOT NULL, • 如果建表时此列设为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。 • 而unique key约束的列可以为null,这是primary key与unique key最大的区别。 •2.一个表只能有一个primary key(单列或多列,多列主键叫联合主键),但可以有多个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列设为联合主键后,他们变为not 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:添加数据 •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 •我们看到,添加的第二条数据违反了刚刚创建的唯一键约束; •将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.enkj.com】 |