MySQL UPDATE时主键冲突引发的思考

作者:叶金荣 来源:IT专家网 时间:2008-06-21 17:00:00 

假设有一个表,结构如下:

mysql> CREATE TABLE `a` ( 
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  `id2` int(10) unsigned NOT NULL DEFAULT '0', 
  PRIMARY KEY (`id`) 
  ) ENGINE=MyISAM;

该表中只有6条记录,如下:

mysql> select * from a;
+----+---------+
| id | city_id |
+----+---------+
|  2 |       2 |
|  3 |       3 |
|  5 |       5 |
|  4 |       4 |
|  6 |       6 |
|  7 |       7 |
+----+---------+

现在想要把id字段分别-1,执行以下语句,得到报错:

  mysql> update a set id=id-1; 
  ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'

看看更新后的结果,可以看到:


mysql> select * from a;
+----+---------+
| id | city_id |
+----+---------+
|  1 |       2 |
|  2 |       3 |
|  5 |       5 |
|  4 |       4 |
|  6 |       6 |
|  7 |       7 |
+----+---------+

存储在最前面的2条记录更新成功了,后面的则失败,因为第三条记录如果也要更新,则会引发主键冲突。

这个时候,如果我们在更新时增加 ORDER BY 的话,则可以顺利更新成功。  

mysql> update a set id=id-1 order by id; 
  Query OK, 6 rows affected (0.00 sec) 
  Rows matched: 6 Changed: 6 Warnings: 0

接下来,我们看看把它转成 innodb 表,结果会是怎样的。


mysql> alter table a engine = innodb;
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from a;
+----+---------+
| id | city_id |
+----+---------+
|  2 |       2 |
|  3 |       3 |
|  4 |       4 |
|  5 |       5 |
|  6 |       6 |
|  7 |       7 |
+----+---------+

看到变化了吧,行数据按照 id 的顺序来显示了。

标签:mysql,表,错误
0
投稿

猜你喜欢

  • 树莓派+摄像头实现对移动物体的检测

    2022-05-28 19:57:26
  • JS异步宏队列与微队列原理区别详解

    2024-04-22 13:26:36
  • Pytorch dataloader在加载最后一个batch时卡死的解决

    2022-09-15 06:50:34
  • Python 正则表达式入门(初级篇)

    2021-12-03 23:41:12
  • PHP实现二维数组中的查找算法小结

    2023-09-08 05:08:24
  • python 美化输出信息的实例

    2022-04-15 09:53:54
  • JS 实现10进制转换36进制的示例代码

    2024-04-28 09:50:01
  • Python内置的HTTP协议服务器SimpleHTTPServer使用指南

    2021-11-22 08:11:12
  • jenkins配置163邮箱的操作方法

    2023-08-10 22:54:05
  • 如何更改mysql命令下提示信息

    2010-10-25 19:48:00
  • flask+layui+echarts实现前端动态图展示数据效果

    2023-06-24 15:41:55
  • 详解pytest实现mark标记功能详细介绍

    2022-01-16 23:59:48
  • 用Python从零实现贝叶斯分类器的机器学习的教程

    2021-02-21 05:14:27
  • ASP中取得图片宽度和高度的类

    2008-10-29 12:38:00
  • Python如何存储和读取ASCII码形式的byte数据

    2021-05-18 04:31:39
  • pandas通过索引进行排序的示例

    2021-04-21 04:19:55
  • Linux系统中为php添加pcntl扩展

    2023-09-04 02:58:15
  • Django RBAC权限管理设计过程详解

    2021-09-02 03:57:07
  • MySQL数据误删除的快速解决方法(MySQL闪回工具)

    2024-01-14 08:04:02
  • python实现kNN算法识别手写体数字的示例代码

    2021-07-14 12:35:03
  • asp之家 网络编程 m.aspxhome.com