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
投稿

猜你喜欢

  • XMLHTTP 使用代理获取数据asp代码

    2010-03-22 14:40:00
  • 如何调用SQL Server的存储过程?

    2009-11-15 20:15:00
  • ASP实现全站的301跳转

    2010-03-27 21:45:00
  • asp如何制作一个股票滚屏显示面板?

    2010-07-07 12:27:00
  • 如何解决AJAX中跨域访问出现'没有权限'的错误

    2008-09-11 17:20:00
  • asp使用session防止网页频繁刷新

    2007-09-26 14:25:00
  • Web 前端优化最佳实践之 Cookie 篇

    2008-06-25 13:00:00
  • JavaScript Table行定位效果

    2009-05-25 10:47:00
  • SQL Server 2000 清理日志精品图文教程

    2012-07-21 14:31:17
  • SQL Server 复制需要有实际的服务器名称才能连接到服务器

    2012-07-11 15:46:51
  • 教你用压缩技术给SQL Server备份文件瘦身

    2009-03-05 14:59:00
  • asp将table生成excel文件(xls)

    2011-03-07 11:17:00
  • SQL优化基础 使用索引(一个小例子)

    2012-01-29 18:29:26
  • 如何实现优惠打折?

    2010-06-03 10:27:00
  • Apple在Safari 4中抛弃品牌视觉设计

    2009-02-26 13:05:00
  • javascript读取Json数据并分页显示,支持键盘和滚轮翻页

    2010-01-06 13:03:00
  • SQL Server中应当怎样得到自动编号字段

    2009-01-15 12:48:00
  • JS代码混淆加密工具

    2008-05-25 13:49:00
  • ASP使用MYSQL数据库全攻略

    2009-11-08 18:27:00
  • asp修改文件和文件夹的名字的代码

    2011-04-11 11:04:00
  • asp之家 网络编程 m.aspxhome.com