Primary key和Unique Key的区别

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值时,可以有重复的,而其他的则不能插入重复值。

时间: 2024-10-06 14:05:21

Primary key和Unique Key的区别的相关文章

mysql中key 、primary key 、unique key 与index区别

一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varchar(100) default NULL, operation_time datetime default NULL, logrecord_operation varchar(100) default NULL, PRIMARY KEY (logrecord_id), KEY wh

[Z]mysql中key 、primary key 、unique key 与index区别

一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varchar(100) default NULL, operation_time datetime default NULL, logrecord_operation varchar(100) default NULL, PRIMARY KEY (logrecord_id), KEY wh

the difference between primary key and unique key

primary key:主键约束 unique key:唯一键约束 相同点:唯一,既值都不能重复 不同点: 1.一个表中只能有一个主键约束,但是唯一键约束可以有多个: 2.主键约束可以由一个或多个键组成,而唯一键约束只作用在一个键上: 3.主键作用的字段值不能为空,而唯一键作用的字段值可以为空. 主键本质是约束,值不为空,一个表只能建一个,其目的是检查数据的正确性:唯一索引本质是索引,值可为空,一个表能建一多个,其目的是实现数据查询的优化:

Primary Key and Unique Key difference in SQL Server

posted from http://www.sqlservergeeks.com/primary-key-and-unique-key-difference-in-sql-server/ Primary and Unique Key both enforce uniqueness of columns on which they are defined. Then where do they differ? They differ in following way -          A p

MySQL 中 key, primary key ,unique key,index的区别

一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varchar(100) default NULL, operation_time datetime default NULL, logrecord_operation varchar(100) default NULL, PRIMARY KEY (logrecord_id), KEY wh

mySQL中删除unique key的语法 (删除某个字段的唯一性)

mySQL中删除unique key的语法 CREATE TABLE `good_booked` (  `auto_id` int(10) NOT NULL auto_increment,  `good_id` int(11) default NULL,  `chemist_id` int(11) default NULL,  PRIMARY KEY  (`auto_id`),  UNIQUE KEY `good_id` (`good_id`,`chemist_id`),  KEY `curre

SQL高级应用--约束(NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT)

一.SQL约束 约束用于限制加入标的数据的类型 可以在创建表的时候规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE语句) 主要探讨以下的几种约束: 1) NOT NULL 2) UNIQUE 3) PRIMARY KEY 4) FOREIGN KEY 5) CHECK 6) DEFAULT 二.SQL NOT NULL 约束 NOT NULL约束强制列不接受 NULL值 NOT NULL约束强制字段始终包含值.这意味着,如果不向字段添加值,就

INDEX && PRIMARY KEY && UNIQUE KEY

When I have do some sql tody, some confusion come up to me. Its about the index && PRIMARY KEY && UNIQUE KEY in MySQL. So I google it for the answers. There is a clearly answer on the StackOverflow. So I share it on this BLOG. About INDEX:

MySQL的UNIQUE KEY对数据中字母的大小写不敏感

今天遇到一个坑,对于下列这样一个表: CREATE TABLE `test3` ( `id` int(11) NOT NULL, `name` char(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8: 它的数据如下: +----+------+ | id | name | +----+------+ | 1 | aaa | | 2 | Aaa | +----+------+ 现在我想在这个表上的