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 | +----+---------+ |
現(xiàn)在想要把id字段分別-1,執(zhí)行以下語(yǔ)句,得到報(bào)錯(cuò):
mysql> update a set id=id-1; ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY' |
看看更新后的結(jié)果,可以看到:
mysql> select * from a; +----+---------+ | id | city_id | +----+---------+ | 1 | 2 | | 2 | 3 | | 5 | 5 | | 4 | 4 | | 6 | 6 | | 7 | 7 | +----+---------+ |
存儲(chǔ)在最前面的2條記錄更新成功了,后面的則失敗,因?yàn)榈谌龡l記錄如果也要更新,則會(huì)引發(fā)主鍵沖突。
這個(gè)時(shí)候,如果我們?cè)诟聲r(shí)增加 ORDER BY 的話(huà),則可以順利更新成功。
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 |
接下來(lái),我們看看把它轉(zhuǎn)成 innodb 表,結(jié)果會(huì)是怎樣的。
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 | +----+---------+ |
看到變化了吧,行數(shù)據(jù)按照 id 的順序來(lái)顯示了。