浅谈unique列上插入重复值的MySQL解决方案

数据库 MySQL 数据库运维
本文将介绍在MySQL中unique列上插入重复值的解决方案,希望对广大数据库开发人员有所帮助。

本文的unique列上插入重复值解决方案,主要基于MySQL平台。通过这些,可以做到一些新的功能和应用。希望本文能对大家有所帮助。

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

  1. mysql> create table menus(id tinyint(4) not null auto_increment,  
  2.    -> label varchar(10) null,url varchar(20) null,unique key(id));  
  3. Query OK, 0 rows affected (0.13 sec)  
  4. mysql> insert into menus(label,url) values('Home','home.html');  
  5. Query OK, 1 row affected (0.06 sec)  
  6. mysql> insert into menus(label,url) values('About us','aboutus.html');  
  7. Query OK, 1 row affected (0.05 sec)  
  8. mysql> insert into menus(label,url) values('Services','services.html');  
  9. Query OK, 1 row affected (0.05 sec)  
  10. mysql> insert into menus(label,url) values('Feedback','feedback.html');  
  11. Query OK, 1 row affected (0.05 sec) 
  1. mysql> select * from menus;  
  2. +----+----------+---------------+  
  3. | id | label   | url          |  
  4. +----+----------+---------------+  
  5. | 1 | Home    | home.html    |  
  6. | 2 | About us | aboutus.html |  
  7. | 3 | Services | services.html |  
  8. | 4 | Feedback | feedback.html |  
  9. +----+----------+---------------+  
  10. rows in set (0.00 sec) 

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

  1. mysql> insert into menus(id,label,url) values(4,'Contact us','contactus.html');  
  2. ERROR 1062 (23000): Duplicate entry '4' for key 'id' 

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

  1. mysql> insert ignore into menus(id,label,url) values(4,'Contact us','contactus.html');  
  2. Query OK, 0 rows affected (0.00 sec)  
  3. mysql> select * from menus;  
  4. +----+----------+---------------+  
  5. | id | label   | url          |  
  6. +----+----------+---------------+  
  7. | 1 | Home    | home.html    |  
  8. | 2 | About us | aboutus.html |  
  9. | 3 | Services | services.html |  
  10. | 4 | Feedback | feedback.html |  
  11. +----+----------+---------------+  
  12. rows in set (0.00 sec) 

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

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

  1. mysql> insert into menus(id,label,url) values(4,'Contact us','contactus.html')  
  2.    -> on duplicate key update label='Contact us',url='contactus.html';  
  3. Query OK, 2 rows affected (0.05 sec) 

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

  1. mysql> select * from menus;  
  2. +----+------------+----------------+  
  3. | id | label     | url           |  
  4. +----+------------+----------------+  
  5. | 1 | Home      | home.html     |  
  6. | 2 | About us  | aboutus.html  |  
  7. | 3 | Services  | services.html |  
  8. | 4 | Contact us | contactus.html |  
  9. +----+------------+----------------+  
  10. rows in set (0.01 sec) 

【编辑推荐】

  1. MySQL全文检索中Like索引的实现
  2. 使用调度和锁定进行MySQL查询优化
  3. MySQL基本调度策略浅析
  4. MySQL一派添“轻功”Drizzle+PHP抢先体验
  5. 学会设置五大类MySQL参数
责任编辑:彭凡 来源: ITPUB
相关推荐

2017-04-13 11:20:37

图片宽度解决方案前端

2011-06-20 13:24:11

网站快照

2021-10-18 07:58:33

MyBatis Plu数据库批量插入

2010-05-17 09:49:46

MySQL中文问题

2010-06-07 13:08:53

MySQL插入处理重复

2014-03-06 10:52:57

Windows Ser重复数据

2010-05-28 19:39:28

MySQL 编码转换

2010-05-28 13:04:04

MySQL root

2019-07-16 06:30:19

MySQL同步延迟数据库

2009-01-12 12:16:34

重复数据删除选购方案

2010-05-17 14:49:43

MySQL中文乱码

2009-07-15 17:00:49

JDBC查询

2010-04-28 11:48:13

Oracle MySQ

2010-05-11 17:56:59

MySQL Table

2010-05-17 14:17:25

MySQL pytho

2010-05-12 16:47:54

MySQL 中文乱码

2010-05-28 19:25:11

MySQL移植问题

2011-05-12 13:58:56

mysql数据转移

2011-03-07 16:42:05

MySQL数据库安全

2010-05-21 13:05:41

MySQL错误
点赞
收藏

51CTO技术栈公众号