方法一:ALTER TABLE AUTO_INCREMENT = N(保留資料、靈活)
-- 歸零(下一筆 ID=1)
ALTER TABLE t AUTO_INCREMENT = 1;
-- 指定起始值(分庫分表避免 ID 衝突)
ALTER TABLE t AUTO_INCREMENT = 1000000;
- 即時生效,無需重啟,不鎖表(MDL 鎖極短)。
- 若 N ≤ 現有最大 ID,MySQL 自動調整為
MAX(id)+1,不報錯。
- 8.0 持久化至 Redo Log,重啟不失效。
方法二:TRUNCATE TABLE(清空表 + 歸零,極快)
TRUNCATE TABLE t;
- DDL 操作,不可回滾,不觸發 Trigger,不寫 Binlog(Statement 格式)。
- 釋放磁碟空間、重置自增計數器、重建索引。
- 被外鍵引用時無法執行。
方法三:DELETE + ALTER(舊版變通,不推薦)
DELETE FROM t;
ALTER TABLE t AUTO_INCREMENT = 1;
DELETE 不重置自增值,產生大量 Binlog/Undo,不釋放空間,效能差。
場景選型表
| 場景 | 推薦方法 |
| 測試環境清表重測 | TRUNCATE |
| 生產歸檔歷史資料,新表從 1 開始 | CREATE TABLE new LIKE old; ALTER TABLE new AUTO_INCREMENT=1; |
| 分庫分表合併,預留 ID 範圍 | ALTER TABLE t AUTO_INCREMENT = shard_id * 1000000 + 1; |
| 刪除大量尾部資料後回收 ID | ALTER TABLE t AUTO_INCREMENT = (SELECT MAX(id)+1 FROM t); |
InnoDB 自增鎖模式影響
innodb_autoinc_lock_mode = 1(預設,連續模式):簡單 INSERT 鎖表級自增鎖,批次 INSERT 可能產生間隙。
innodb_autoinc_lock_mode = 2(交錯模式):高併發下無鎖,但自增值不連續,LAST_INSERT_ID() 返回第一筆值,Statement 複制不安全。
- 建議保持預設 1,或在明確需求下改 2 配合 Row 格式複制。