業務常需求:測試資料清理後自增 ID 歸零、遷移指定起始 ID、修復跳號。MySQL 提供 `DELETE`、`TRUNCATE`、`ALTER TABLE` 三種路徑,行為差異巨大 (特別是 InnoDB vs MyISAM)。本文實測對比,給出生產環境最佳選擇。
| 方案 | 語法 | 資料刪除 | 自增值重置 | 速度 | 事務/觸發器 | InnoDB/MyISAM 差異 |
|---|---|---|---|---|---|---|
| DELETE | DELETE FROM tbl; ALTER TABLE tbl AUTO_INCREMENT = 100; | 逐行刪除,可 Rollback | ✅ 可指定任意值 (需 > 當前最大值) | 慢 (大表極慢) | 觸發 DELETE 觸發器 | InnoDB: 僅允許設定 > 當前最大值;MyISAM: 設定 ≤ 最大值會自動調整為 max+1 |
| TRUNCATE | TRUNCATE TABLE tbl; | 釋放頁/重建表,不可 Rollback | ✅ 歸零 (1) (5.0.13+ 兩引擎一致) | 極快 (元資料操作) | 不觸發觸發器 | 無差異 |
| DROP + CREATE | DROP TABLE tbl; CREATE TABLE tbl ...; | 整表移除 | ✅ 歸零 (1) | 快 (但需重建索引/權限/觸發器) | 不觸發 | 無差異 |
-- 方案 A: TRUNCATE + ALTER (最快、最標準)
TRUNCATE TABLE tbl;
ALTER TABLE tbl AUTO_INCREMENT = 10000;
-- 方案 B: 僅 ALTER (保留資料、調整起始值)
ALTER TABLE tbl AUTO_INCREMENT = 10000; -- 僅當 10000 > 當前下一自增值時生效
-- 方案 C: 插入佔位行再刪除 (不推薦,產生碎片)
INSERT INTO tbl (id) VALUES (9999); DELETE FROM tbl WHERE id = 9999;
清空資料且歸零自增 → TRUNCATE TABLE tbl; (首選,秒級)。
清空資料並指定起始值 → TRUNCATE TABLE tbl; ALTER TABLE tbl AUTO_INCREMENT = N;。
保留資料、調整起始值 (預留 ID 空間) → ALTER TABLE tbl AUTO_INCREMENT = N; (確認 N > 當前下一值)。
大表刪除部分資料 → 分批 `DELETE ... LIMIT 10000` + 索引優化,勿全表 DELETE。