帶 AUTO_INCREMENT 主鍵的表執行 DELETE FROM tbl 清空數據後,再次插入時自增 ID 的起始值在 MyISAM 與 InnoDB 表現截然不同,且 InnoDB 重啟後會重置計數器導致主鍵衝突風險。本文通過實驗驗證並給出生產規避建議。
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEYCREATE TABLE t7 (id INT UNSIGNED AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id)) ENGINE=MyISAM;
INSERT INTO t7(name) VALUES('GZ'),('SH'),('BJ'),('SZ'),('HZ'); -- id 1-5
DELETE FROM t7;
SHOW CREATE TABLE t7; -- AUTO_INCREMENT=6
INSERT INTO t7(name) VALUES('NJ'); -- id=6 ✅
-- 重啟 mysqld 後 AUTO_INCREMENT 仍為 6,續號安全
結論:MyISAM 將 AUTO_INCREMENT 持久化在 .MYI 索引文件頭部,**重啟不重置**,極其安全。
CREATE TABLE t2 (id INT UNSIGNED AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id)) ENGINE=InnoDB;
INSERT INTO t2(name) VALUES('GZ'),('SH'),('BJ'),('SZ'),('HZ'); -- id 1-5
DELETE FROM t2;
INSERT INTO t2(name) VALUES('NJ'); -- id=6 ✅ (未重啟時正常遞增)
-- 關鍵差異:重啟 mysqld 後
INSERT INTO t2(name) VALUES('FJ'); -- id=1 ❌ 重置導致主鍵衝突風險!
dict_table_t::auto_inc),**不刷盤**,重啟時通過 SELECT MAX(id)+1 重新計算 → 表為空則歸 1innodb_autoinc_persistent(默認 ON)將計數器寫入 Redo Log,重啟後可恢復,但仍建議避免依賴TRUNCATE TABLE t2; 會重置自增計數器且釋放空間,行為一致且高效ALTER TABLE t2 AUTO_INCREMENT = N; 手動校準(N 為業務預期下一值)| 場景 | MyISAM | InnoDB (≤5.7) | InnoDB (8.0+) |
|---|---|---|---|
| DELETE 後插入 | 續號 ✅ | 續號 ✅ | 續號 ✅ |
| DELETE → 重啟 → 插入 | 續號 ✅ | 歸 1 ❌ | 續號 ✅ (持久化) |
| TRUNCATE 後 | 歸 1 | 歸 1 | 歸 1 |