`
like.eagle
  • 浏览: 249065 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MYSQL的primary key和unique key的区别

阅读更多

【网络转载】http://blog.csdn.net/yaoxy/archive/2009/07/16/4353115.aspx

 

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

 

分享到:
评论

相关推荐

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

    主要介绍了mysql中key 、primary key 、unique key 与index区别的相关资料,需要的朋友可以参考下

    MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别

    那这个问题就可以简化为 PRIMARY KEY,UNIQUE KEY 和 INDEX 的区别。而这三者也正好是索引的划分,主键索引,唯一索引和普通索引(INDEX)。 使用 INDEX 来加速从数据库中读取数据。INDEX 通常加在那些 JOIN, WHERE...

    SQL UNIQUE 约束

    UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。 CREATE TABLE 时...

    mysql unique key在查询中的使用与相关问题

    1、建表语句: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, ... UNIQUE KEY `idxunique_first_name_gender` (`first_name`

    Mysql数据库设计.pdf

    a%b表⽰以a开头b结尾的任意长度的字符串 _(下横线) a_b表⽰以a开头b结尾的长度为3的任意字符, PRIMARY KEY UNIQUE NOT NULL AUTO_INCREMENT DEFAULT default_value PRIMARY KEY 与UNIQUE 数据库操作: show ...

    MySQL使用UNIQUE实现数据不重复插入

    UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 拥有自动定义的 UNIQUE 约束。 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。 下面的 SQL 在 ...

    MySQL数据库实验二

    在课程结束时,使用SQL查询分析器用PRIMARY KEY、CHECK、FOREIGN KEY……REFERENCES、NOT NULL、UNIQUE等关键字验证MYSQL的实体完整性、参照完整性及用户定义完整性。 二、实验内容 1、在查询分析器中用PRIMARY KEY...

    mysql语言的基本操作流程

    primary key//只能有一个 ) create table teacher( ID int auto_increment, Name varchar(20), Sex varchar(1), Age int, PRIMARY key(ID)//主键名 ); use mysqltest; show tables; alter table 表格名 ...

    新华字典MySQL数据

    新华字典MySQL数据 CREATE TABLE `xhzd_surnfu` ( `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '主键自增id', `zi` varchar(6) NOT NULL DEFAULT '' COMMENT '汉字', ... UNIQUE KEY `id_pk`

    JSP+MYSQL网上商城

    UNIQUE KEY MovieID (MovieID) ) TYPE=MyISAM; -- -- Dumping data for table `movies` -- -- -- Table structure for table `users` -- CREATE TABLE users ( UserID bigint(20) NOT NULL auto_increment, ...

    深入mysql ON DUPLICATE KEY UPDATE 语法的分析

    mysql “ON DUPLICATE KEY UPDATE” 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列...

    MySQL数据库表分区注意事项大全【推荐】

    若表有primary key或unique key,则分区表的分区列必须包含在primary key或unique key列表里,这是为了确保主键的效率,否则同一主键区的东西一个在A分区,一个在B分区,显然会比较麻烦。 2、各分区类型条件 ...

    mysql数据库查询优化测试环境脚本

    CREATE TABLE t1(id1 INT,a1 INT,b1 INT,PRIMARY KEY(id1)); CREATE TABLE t2(id2 INT,a2 INT,b2 INT); CREATE TABLE t3(id3 INT UNIQUE,a3 INT,b3 INT); CREATE TABLE t4(id4 INT,a4 INT,b4 INT); CREATE TABLE t5...

    数据库实验四 数据库实验

    数据库实验四 数据库实验 数据库实验四 数据库实验 数据库实验四 数据库实验 数据库实验四 数据库实验 数据库实验四 数据库实验

    Mysql中replace与replace into的用法讲解

    而replace into其实与insert into很相像,但对于replace into,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。 replace是mysql 里面处理...

    中国5级省市县镇村MySQL完整数据-SQL文件

    UNIQUE KEY `village_id` (`village_id`), KEY `province_id` (`province_id`) USING BTREE, KEY `city_id` (`city_id`) USING BTREE, KEY `town_id` (`town_id`) USING BTREE, KEY `county_id` (`county_id`) ...

    mysql数据库的基本操作语法

    primary key:主键约束,指定某列的数据不能重复、唯一 foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 check:检查,指定一个表达式,用于检验指定数据 MySQL不支持check约束,但可以使用...

    MySQL约束(三).pdf

    表约束与列约束:比较表级约束和列级约束的区别和使用场景。 约束的创建与管理:如何添加、修改和删除约束。 约束在复杂查询中的应用:展示如何在复杂的SQL查询中利用约束。 适用人群 数据库管理员:需要深入理解...

Global site tag (gtag.js) - Google Analytics