Mysql中unique与primary约束的区别分析

定义了UNIQUE约束的字段中不能包含重复值,可以为一个或多个字段定义UNIQUE约束,因此,UNIQUE即可以在字段级也可以在表级定义,在UNIQUE约束的字段上可以包含空值. ORACLE自动会为具有PRIMARY KEY约束的字段(主码字段)建立一个唯一索引和一个NOT NULL约束,定义PRIMARY KEY约束时可以为它的索引; UNIQUED 可空,可以在一个表里的一个或多个字段定义;
 

PRIMARY KEY不可空不可重复,在一个表里可以定义联合主键;简单的说, primary key = unique + not null

 
unique就是唯一,当你需要限定你的某个表字段每个值都唯一,没有重复值时使用. 比如说,如果你有一个person_Info表,并且表中有个身份证的column,那么你就可以指定该字段unique.

 
从技术的角度来看,Primary Key和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 `current_state` (`current_state`),
  KEY `send_time` (`send_time`)
)

想删除某个表中某个字段的unique key: 
 

 代码如下 复制代码
ALTER TABLE good_booked DROP INDEX good_id;

UNIQUE防止重复插入数据示例

当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ONDUPLICATEKEYUPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。这样就可以防止数据库中存在重复的数据项

 代码如下 复制代码

mysql>createtablemenus(idtinyint(4)notnullauto_increment,
->labelvarchar(10)null,urlvarchar(20)null,uniquekey(id));
QueryOK,0rowsaffected(0.13sec)
mysql>insertintomenus(label,url)values(“Home”,”home.html”);
QueryOK,1rowaffected(0.06sec)
mysql>insertintomenus(label,url)values(“Aboutus”,”aboutus.html”);
QueryOK,1rowaffected(0.05sec)
mysql>insertintomenus(label,url)values(“Services”,”services.html”);
QueryOK,1rowaffected(0.05sec)
mysql>insertintomenus(label,url)values(“Feedback”,”feedback.html”);
QueryOK,1rowaffected(0.05sec)

mysql>select*frommenus;
+—-+———-+—————+
|id|label|url|
+—-+———-+—————+
|1|Home|home.html|
|2|Aboutus|aboutus.html|
|3|Services|services.html|
|4|Feedback|feedback.html|
+—-+———-+—————+
4rowsinset(0.00sec)

如果现在在unique列插入一条违背唯一约束的记录,MySQL会中断操作,提示出错:

 代码如下 复制代码

mysql>insertintomenus(id,label,url)values(4,”Contactus”,”contactus.html”);
ERROR1062(23000):Duplicateentry“4″forkey“id”

在前面的INSERT语句添加IGNORE关键字时,如果认为语句违背了唯一约束,MySQL甚至不会尝试去执行这条语句,因此,下面的语句不会返回错误:

 代码如下 复制代码

mysql>insertignoreintomenus(id,label,url)values(4,”Contactus”,”contactus.html”);
QueryOK,0rowsaffected(0.00sec)
mysql>select*frommenus;
+—-+———-+—————+
|id|label|url|
+—-+———-+—————+
|1|Home|home.html|
|2|Aboutus|aboutus.html|
|3|Services|services.html|
|4|Feedback|feedback.html|
+—-+———-+—————+
4rowsinset(0.00sec)

当有很多的INSERT语句需要被顺序地执行时,IGNORE关键字就使操作变得很方便。使用它可以保证不管哪一个INSERT包含了重复的键值,MySQL都回跳过它(而不是放弃全部操作)。

在这种情况下,我们还可以通过添加MySQL4.1新增加的ONDUPLICATEKEYUPDATE子句,使MySQL自动把INSERT操作转换为UPDATE操作。这个子句必须具有需要更新的字段列表,这个列表和UPDATE语句使用的列表相同。

 代码如下 复制代码

mysql>insertintomenus(id,label,url)values(4,”Contactus”,”contactus.html”)
->onduplicatekeyupdatelabel=”Contactus”,url=”contactus.html”;
QueryOK,2rowsaffected(0.05sec)

在这种情况下,如果MySQL发现表已经包含具有相同唯一键的记录,它会自动更新旧的记录为ONDUPLICATEKEYUPDATE从句中指定的新值:

 代码如下 复制代码

mysql>select*frommenus;
+—-+————+—————-+
|id|label|url|
+—-+————+—————-+
|1|Home|home.html|
|2|Aboutus|aboutus.html|
|3|Services|services.html|
|4|Contactus|contactus.html|
+—-+————+—————-+
4rowsinset(0.01sec)

不同点:
 

(1) 唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。

 (2) 可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但是,唯一性约束所在的列并不是表的主键列。

 

(3) 唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引是聚簇索引。

 (4)建立主键的目的是让外键来引用.

 (5)一个表最多只有一个主键,但可以有很多唯一键

时间: 2024-07-29 13:19:28

Mysql中unique与primary约束的区别分析的相关文章

基于unique与primary约束的区别分析_Mysql

  定义了UNIQUE约束的字段中不能包含重复值,可以为一个或多个字段定义UNIQUE约束,因此,UNIQUE即可以在字段级也可以在表级定义,在UNIQUE约束的字段上可以包含空值. ORACLE自动会为具有PRIMARY KEY约束的字段(主码字段)建立一个唯一索引和一个NOT NULL约束,定义PRIMARY KEY约束时可以为它的索引: UNIQUED 可空,可以在一个表里的一个或多个字段定义: PRIMARY KEY不可空不可重复,在一个表里可以定义联合主键:简单的说,  primary

UNIQUE和PRIMARY 约束的区别

  定义了UNIQUE约束的字段中不能包含重复值,可以为一个或多个字段定义UNIQUE约束,因此,UNIQUE即可以在字段级也可以在表级定义,在UNIQUE约束的字段上可以包含空值. ORACLE自动会为具有PRIMARY KEY约束的字段(主码字段)建立一个唯一索引和一个NOT NULL约束,定义PRIMARY KEY约束时可以为它的索引: UNIQUED 可空,可以在一个表里的一个或多个字段定义: PRIMARY KEY不可空不可重复,在一个表里可以定义联合主键:简单的说,  primary

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

mysql中索引是非常重要的知识点,相比其他的知识点,索引更难掌握,并且mysql中的索引种类也有很多,比如primary key .unique key 与index等等,本文章向大家介绍mysql中key .primary key .unique key 与index区别.  一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varch

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

问题描述 请详细说明下 mysql中key .primary key .unique key 与index区别 解决方案 参考下这个链接:http://zccst.iteye.com/blog/1697043

Mysql中 unique列插入重复值该怎么解决呢_Mysql

当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT.中断操作或者更新旧记录为新值. mysql> create table menus(id tinyint(4) not null auto_increment, -> label varchar(10) null,url varchar(20) null,unique key(id)); Query

mysql中关于外键约束的小问题

问题描述 mysql中关于外键约束的小问题 我想问,主表被references后不允许先删除记录,又说从表指定on delete cascade后删除主表记录时从表记录随之删除,你说这不矛盾吗?到底让不让删除? 例如下面这张图,student_table参考teacher_table,我却删不掉主表teacher_table 解决方案 嗯,这个问题已经解决啦,是我测试代码写错了,删除记录用del 我那个写成drop了 解决方案二: 你需要先解除外键约束 再删除表 解决方案三: MySQL外键约束

mysql中int(1)和int(11)区别详解

mysql字段定义中INT(x)中的x仅仅指的是显示宽度.该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示.所以x的定义与存储空间没有任何关系都是4个字节. 作为SQL标准的扩展,MySQL也支持整数类型TINYINT.MEDIUMINT和BIGINT.下面的表显示了需要的每个整数类型的存储和范围. 类型 字节 最小值 最大值     (带符号的/无符号的) (带符号的/无符号的) TINYINT 1

mysql中count(*)和count(id)的区别

mysql查询在分页或者统计某个条件下的记录数,会常用到count(),那么你知道count(*)和count(id)或count(name)等等有什么区别吗?   看看下面这个图,应该就明白了:     count(*)表示所有记录数,包括为空NULL的数据:而count(某个字段),只会计算有效数据的条数.这就是它们之间最主要的区别了. 网上搜索了下,发现各种说法都有: 比如认为COUNT(COL)比COUNT(*)快的: 认为COUNT(*)比COUNT(COL)快的: 还有朋友很搞笑的说

详解MySQL中的外键约束问题_Mysql

使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建.检索.更新和删除等操作都是些比较简单的过程.理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务器端脚本语言,就足以应付对MySQL表所需的各种操作了,尤其是当您使用了快速MyISAM数据库引擎的时候.但是,即使在最简单的情况下,事情也要比我们想象的要复杂得多.下面我们用一个典型的例子进行说明.假设您正在运行一个博客网站,您几乎天天更新,并且该站点允许访问者评论您的帖子. MySQL外键约束条件