Primary key 与Unique Key都是唯一性约束。但二者有很大的区别: 1、Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求。 2、一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY。 下面以测试说明: SQL> create table t (a int,b int,c int,d int); Table created. SQL> desc t A NUMBER(38) SQL> alter table t add constraint pk_t primary key (a,b); Table altered. SQL> desc t A NOT NULL NUMBER(38) 可以看到A、B两个列都自动改为了NOT NULL SQL> alter table t modify (a int null); SQL> alter table t drop constraint pk_t; Table altered. SQL> alter table t add constraint uk_t_1 unique (a,b); Table altered. SQL> desc t A NUMBER(38) 我们看到列A又变回了NULL。 注意到,在删除主键时,列的NULLABLE会回到原来的状态。如果在创建主键后,对原来为NULL的主键列,显式设为NOT NULL,在删除主键后仍然是NOT NULL。比如在创建主键后,执行下面的操作,可以看到: SQL> alter table t modify (b int not null); Table altered. SQL> alter table t drop constraint pk_t; Table altered. SQL> desc t A NUMBER(38) 再做如下的实验: SQL> drop table t; Table dropped. SQL> create table t (a int,b int,c int,d int); Table created. SQL> alter table t add constraint uk_t_1 unique (a,b); Table altered. SQL> alter table t add constraint uk_t_2 unique (c,d); Table altered. 可以看到可以增加两个UNIQUE KEY。看看能不能增加两个主键: SQL> alter table t add constraint pk_t primary key (c); Table altered. SQL> alter table t add constraint pk1_t primary key (d); SQL> alter table t drop constraint pk_t; Table altered. SQL> insert into t (a ,b ) values (null,null); 1 row created. SQL> / 1 row created. SQL> insert into t (a ,b ) values (null,1); 1 row created. SQL> /
1 row created. SQL> / 主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。 |
|
来自: yongcheng.min > 《数据库》