資料表 a,主鍵 id,6 筆資料:
+----+------+
| id | id2 |
+----+------+
| 2 | 2 |
| 3 | 3 |
| 5 | 5 |
| 4 | 4 |
| 6 | 6 |
| 7 | 7 |
+----+------+
執行 UPDATE a SET id = id - 1; 報錯:
ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'
前兩筆成功(2→1, 3→2),第三筆 5→4 與現有 id=4 衝突。
UPDATE a SET id = id - 1 ORDER BY id;
依主鍵遞增更新,避免衝突,6 筆全數成功。
ORDER BY 時,依儲存順序更新 → 易發生主鍵衝突ORDER BY 時,預設依主鍵順序更新 → 天然避免衝突CREATE TABLE a (id INT UNSIGNED PRIMARY KEY, id2 INT UNSIGNED) ENGINE=MyISAM;
-- 插入無序資料
UPDATE a SET id = id - 1; -- 失敗
UPDATE a SET id = id - 1 ORDER BY id; -- 成功
ALTER TABLE a ENGINE = InnoDB;
-- 資料自動依 id 排序顯示
UPDATE a SET id = id - 1; -- 直接成功,無需 ORDER BY
TRUNCATE TABLE a;
INSERT INTO a VALUES (2,2),(3,3),(5,5),(4,4),(6,6),(7,7);
SELECT * FROM a; -- 仍依 id 排序顯示
UPDATE a SET id = id - 1; -- 成功
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 儲存結構 | Heap (HOT) | Clustered Index (IOT) |
| 資料順序 | 隨機/插入順序 | 主鍵順序 |
| 預設更新順序 | 儲存順序 | 主鍵順序 |
| UPDATE 主鍵衝突風險 | 高(需 ORDER BY) | 低(天然避免) |
ORDER BY 明確指定順序