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约束,证明了主键约束也是唯一约束。