TRUNCATE TABLE 是清空大表、重置自增計數器的利器,但與 DELETE 有本質區別,誤用可能導致外鍵報錯、觸發器失效、備份遺漏。本文深度對比兩者機制,給出安全使用清單。
TRUNCATE TABLE `table_name`;
AUTO_INCREMENT 計數器歸 1(或指定起始值)。| 維度 | TRUNCATE TABLE | DELETE FROM table |
|---|---|---|
| 執行機制 | DDL:釋放數據頁,只記錄頁釋放日誌 | DML:逐行刪除,每行寫入事務日誌 |
| 速度 | 毫秒級(與表大小無關) | 隨行數線性增長 |
| 事務日誌 | 極少(只記頁釋放) | 大量(每行一條) |
| 自增計數器 | 重置為種子值 | 保持不變 |
| 觸發器 | 不觸發 BEFORE/AFTER DELETE | 正常觸發 |
| 外鍵約束 | 被引用表不可用(報錯 1701) | 允許(需配合 ON DELETE CASCADE/SET NULL) |
| 回滾 | 隱式提交,不可回滾 | 事務內可回滾 |
| 權限 | 需 DROP 權限 | 需 DELETE 權限 |
TRUNCATE 分區表或舊分區。TRUNCATE + 重新載入種子數據,秒級完成。DELETE 或 TRUNCATE 後 ALTER TABLE t AUTO_INCREMENT = N。RENAME TABLE t TO t_archive,再 CREATE TABLE t LIKE t_archive,避免長鎖表。-- 查看自增值是否重置
SHOW CREATE TABLE `table_name`\G
-- 關注 AUTO_INCREMENT=1
用對 TRUNCATE,大表清理從「分鐘級」變「毫秒級」,是 DBA 效率倍增器。