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

  更新数据时,如果没有指定排序的字段或索引,则默认以随机顺序更新,所以 myisam 表如果不指定 ORDER BY 的话,则采用默认的存储顺序来更新,所以会发生主键冲突的情况。而 innodb 表总是有主键(如果没有定义,则也有默认主键),如果更新时没有指定排序字段或索引,则按照主键顺序来更新,在上面的例子中,就是按照主键 id 的顺序来更新了,因此不会报错。

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


  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条记录更新成功了,后面的则失败,因为第三条记录如果也要更新,则会引发主键冲突。

Tags:  mysql主键

延伸阅读

最新评论

发表评论