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 的顺序来显示了。


猜你喜欢
树莓派+摄像头实现对移动物体的检测

JS异步宏队列与微队列原理区别详解

Pytorch dataloader在加载最后一个batch时卡死的解决
Python 正则表达式入门(初级篇)
PHP实现二维数组中的查找算法小结
python 美化输出信息的实例

JS 实现10进制转换36进制的示例代码

Python内置的HTTP协议服务器SimpleHTTPServer使用指南
jenkins配置163邮箱的操作方法

如何更改mysql命令下提示信息
flask+layui+echarts实现前端动态图展示数据效果

详解pytest实现mark标记功能详细介绍

用Python从零实现贝叶斯分类器的机器学习的教程

ASP中取得图片宽度和高度的类
Python如何存储和读取ASCII码形式的byte数据

pandas通过索引进行排序的示例
Linux系统中为php添加pcntl扩展
Django RBAC权限管理设计过程详解

MySQL数据误删除的快速解决方法(MySQL闪回工具)
python实现kNN算法识别手写体数字的示例代码
