北京SEO

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

2019/10/10/17:34:56  阅读:1904  来源:谷歌SEO算法  标签: Dropbox

定义了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. CREATETABLE`good_booked`(
  2. `auto_id`int(10)NOTNULLauto_increment,
  3. `good_id`int(11)defaultNULL,
  4. `chemist_id`int(11)defaultNULL,
  5. PRIMARYKEY(`auto_id`),
  6. UNIQUEKEY`good_id`(`good_id`,`chemist_id`),
  7. KEY`current_state`(`current_state`),
  8. KEY`send_time`(`send_time`)
  9. )

想删除某个表中某个字段的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. mysql>select*frommenus;
  13. +—-+———-+—————+
  14. |id|label|url|
  15. +—-+———-+—————+
  16. |1|Home|home.html|
  17. |2|Aboutus|aboutus.html|
  18. |3|Services|services.html|
  19. |4|Feedback|feedback.html|
  20. +—-+———-+—————+
  21. 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)一个表最多只有一个主键,但可以有很多唯一键.

广告内容

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

相关阅读

热门评论

小浪SEO博客 小浪SEO博客

专注SEO优化思维、SEO技术的实战分享类博客~

总篇数183

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法