語法對比
-- DELETE
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
-- TRUNCATE
TRUNCATE [TABLE] tbl_name
核心差異對照表
| 維度 | DELETE | TRUNCATE |
| 執行機制 | 逐行標記刪除,寫 Undo Log,觸發器生效 | Drop 表並重建,DDL 操作,隱式提交 |
| WHERE 支持 | 支持 | 不支持(全表清空) |
| 事務安全 | 支持 ROLLBACK | 不支持(自動提交) |
| 鎖粒度 | 行鎖(InnoDB) | 表鎖/元數據鎖 |
| 自增計數器 | 保留最大值+1 | 重置為 1 |
| 返回影響行數 | 精確返回 | 不返回(或 0) |
| 外鍵約束 | 檢查約束,受阻則報錯 | 有外鍵引用時**轉為 DELETE**執行 |
| 觸發器 | BEFORE/AFTER DELETE 觸發 | **不觸發** |
| 性能(大表) | 慢(需掃描、寫日誌) | 極快(毫秒級) |
| 空間回收 | 需 OPTIMIZE TABLE | 立即釋放磁盤空間 |
| 復制影響 | Binlog 記錄每行(ROW 格式) | Binlog 記錄 DDL,從庫同步極快 |
DELETE 進階修飾符
- LOW_PRIORITY:等待無讀鎖時執行(MyISAM)。
- QUICK:不合併索引葉節點,適用「刪除後隨即插入相近鍵」場景。
- IGNORE:忽略錯誤(如外鍵失敗轉警告)。
多表 DELETE 語法
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE t;
SET FOREIGN_KEY_CHECKS=1;
需保留部分數據: