語法
TRUNCATE [TABLE] tbl_name
核心差異:TRUNCATE vs DELETE
| 維度 | TRUNCATE TABLE | DELETE FROM tbl_name |
| WHERE 條件 | 不支援 | 支援 |
| 執行機制 | DDL:Drop + Recreate 表結構 | DML:逐行刪除、記錄 Binlog |
| 速度 | 極快(元數據操作) | 慢(隨行數線性) |
| 事務安全 | 不安全(隱式提交,不可回滾) | 安全(支援 ROLLBACK) |
| 返回影響行數 | 不返回(或返回 0) | 返回實際刪除行數 |
| AUTO_INCREMENT | 重置為 1 | 不重置(保留最大值+1) |
| 觸發器 | 不觸發 | 觸發 BEFORE/AFTER DELETE |
| 外鍵約束 (InnoDB) | 轉為 DELETE 執行 | 正常檢查 |
| 損壞表恢復 | 僅需 .frm 存在即可重建空表 | 無法操作損壞表 |
| 分區表 | 保留分區定義,重建數據/索引文件 | 逐分區刪除 |
引擎特定行為
InnoDB
- 有外鍵引用時 → 退化為逐行
DELETE(保留外鍵檢查);
- 無外鍵 → Fast Truncate(Drop + Recreate);
- 始終重置 AUTO_INCREMENT,無論是否有外鍵。
MyISAM / MEMORY / 其他
- 均為 Fast Truncate;
- 不記錄最後 AUTO_INCREMENT 值,歸零重算;
- 不支援事務,執行期間表鎖獨佔。
實戰場景選型
| 場景 | 推薦 | 理由 |
| 清空大表、重置自增 ID、無外鍵依賴 | TRUNCATE | 秒級完成,釋放磁盤空間 |
| 需保留部分數據、需觸發器、需事務回滾 | DELETE + WHERE | 精確控制、安全 |
| InnoDB 表被外鍵引用 | DELETE 或 先 DISABLE FK → TRUNCATE → ENABLE FK | TRUNCATE 會退化為 DELETE,無速度優勢 |
| 定時任務清理舊分區 | ALTER TABLE ... TRUNCATE PARTITION | 分區級截斷,元數據操作 |
權限要求
需 DROP 權限(因本質是 Drop Table),而非 DELETE 權限。