当前位置:首页 > Mysql教程 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-07 16:20:19 浏览: 评论:0 

定义了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有很多相似之处,但还是有以下异同:

相同:它们都属于实体完整性约束.

例,表结构如下:

  1. CREATE TABLE `good_booked` ( 
  2.   `auto_id` int(10) NOT NULL auto_increment, 
  3.   `good_id` int(11) default NULL
  4.   `chemist_id` int(11) default NULL
  5.   PRIMARY KEY  (`auto_id`), 
  6.   UNIQUE KEY `good_id` (`good_id`,`chemist_id`), 
  7.   KEY `current_state` (`current_state`), 
  8.   KEY `send_time` (`send_time`) 

想删除某个表中某个字段的unique key,代码如下:

ALTER TABLE good_booked DROP INDEX good_id; 

UNIQUE防止重复插入数据示例

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

  1. mysql>createtablemenus(idtinyint(4)notnullauto_increment, 
  2. ->labelvarchar(10)null,urlvarchar(20)null,uniquekey(id)); 
  3. QueryOK,0rowsaffected(0.13sec) 
  4. mysql>insertintomenus(label,url)values(“Home”,”home.html”); 
  5. QueryOK,1rowaffected(0.06sec) 
  6. mysql>insertintomenus(label,url)values(“Aboutus”,”aboutus.html”); 
  7. QueryOK,1rowaffected(0.05sec) 
  8. mysql>insertintomenus(label,url)values(“Services”,”services.html”); 
  9. QueryOK,1rowaffected(0.05sec) 
  10. mysql>insertintomenus(label,url)values(“Feedback”,”feedback.html”); 
  11. QueryOK,1rowaffected(0.05sec) 
  12.  
  13. mysql>select*frommenus; 
  14. +—-+———-+—————+ 
  15. |id|label|url| 
  16. +—-+———-+—————+ 
  17. |1|Home|home.html| 
  18. |2|Aboutus|aboutus.html| 
  19. |3|Services|services.html| 
  20. |4|Feedback|feedback.html| 
  21. +—-+———-+—————+ 
  22. 4rowsinset(0.00sec) 

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

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

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

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

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

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

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

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

  1. mysql>select*frommenus; 
  2. +—-+————+—————-+ 
  3. |id|label|url| 
  4. +—-+————+—————-+ 
  5. |1|Home|home.html| 
  6. |2|Aboutus|aboutus.html| 
  7. |3|Services|services.html| 
  8. |4|Contactus|contactus.html| 
  9. +—-+————+—————-+ 
  10. 4rowsinset(0.01sec) 
  11. --phpfensi.com 

不同点:

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

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

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

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

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

Tags: unique primary约束区别

分享到: