问题描述
请问主键和唯一索引的区别,并测试说明。
专家解答
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 Name Null? Type ----------------------------------------- -------- ----------- A NUMBER(38) B NUMBER(38) C NUMBER(38) D NUMBER(38) SQL> alter table t add constraint pk_t primary key (a,b); Table altered. SQL> desc t Name Null? Type ----------------------------------------- -------- ---------------- A NOT NULL NUMBER(38) B NOT NULL NUMBER(38) C NUMBER(38) D NUMBER(38)
可以看到A、B两个列都自动改为了NOT NULL
SQL> alter table t modify (a int null); alter table t modify (a int null) * ERROR at line 1: ORA-01451: column to be modified to NULL cannot be modified to NULL
可以看到,列A不允许改为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 Name Null? Type ----------------------------------------- -------- ----------- A NUMBER(38) B NUMBER(38) C NUMBER(38) D 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 Name Null? Type ----------------------------------------- -------- ---------- A NUMBER(38) B NOT NULL NUMBER(38) C NUMBER(38) D 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); alter table t add constraint pk1_t primary key (d) * ERROR at line 1:ORA-02260: table can have only one primary key
由此可以看到一个表只能有一个主键。
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> / insert into t (a ,b ) values (null,1) * ERROR at line 1: ORA-00001: unique constraint (SYS.UK_T_1) violated SQL> insert into t (a ,b ) values (1,null); 1 row created. SQL> / insert into t (a ,b ) values (1,null) * ERROR at line 1: ORA-00001: unique constraint (SYS.UK_T_1) violated
主键和唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。
最后修改时间:2019-04-14 10:51:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。