DROP、TRUNCATE、DELETE 均可刪除表數據,但機制、效能、可恢復性、觸發器行為截然不同。本文通過圖解與實測對比,助你精準選型。
| 特性 | DROP TABLE | TRUNCATE TABLE | DELETE FROM |
|---|---|---|---|
| 刪除對象 | 表結構 + 數據 + 索引 + 權限 + 觸發器 | 所有數據 (保留表結構、索引、權限) | 指定條件數據 (可加 WHERE) |
| 屬於 | DDL | DDL | DML |
| 執行速度 | 極快 (元數據操作) | 極快 (釋放頁、重建段) | 慢 (逐行刪除、記錄日誌) |
| 事務支援 | 不可回滾 (隱式提交) | 不可回滾 (隱式提交) | 可回滾 (需顯式事務) |
| 觸發器 | 不觸發 | 不觸發 | 觸發 FOR EACH ROW |
| 自增計數器 | 表不存在,重建時歸 1 | 重置為 1 (或種子值) | 保留當前值,不重置 |
| 空間釋放 | 完全釋放 | 完全釋放 (高水位線歸零) | 不釋放 (標記刪除,空間可復用) |
| 外鍵約束 | 需先刪除引用表外鍵 | 被引用時失敗 (需先禁用 FK) | 受 FK 約束檢查 |
| 權限需求 | DROP 權限 | DROP 權限 (實質) | DELETE 權限 |
DROP TABLE class; -- 表結構、數據、索引、權限一次性消失 -- 如需再用,必須 CREATE TABLE 重建
TRUNCATE TABLE teacher; -- 數據清空,結構保留 -- 自增 ID 歸零:新插入 ID 從 1 開始 -- 高水位線重置,空間歸還 OS
實測對比:
DELETE FROM teacher WHERE id > 10; -- 逐行刪除,寫入 Undo Log + Redo Log -- 可 ROLLBACK -- 觸發 DELETE Trigger -- 高水位線不變,空間標記可復用
SET FOREIGN_KEY_CHECKS=0)ON DELETE 觸發器DROP TABLE + CREATE TABLE (STATEMENT 格式) 或表映射事件 (ROW 格式)需要刪除表結構嗎?
├─ 是 → DROP TABLE
└─ 否 → 需要保留部分數據 (WHERE 條件)?
├─ 是 → DELETE FROM ... WHERE ...
└─ 否 → 需要觸發 Trigger / 可回滾 / 受 FK 約束?
├─ 是 → DELETE FROM table (無 WHERE)
└─ 否 → TRUNCATE TABLE (最快、空間全釋放、自增歸零)
SLEEP(0.5)、或用 pt-archiverSET FOREIGN_KEY_CHECKS=0; TRUNCATE ...; SET FOREIGN_KEY_CHECKS=1; (極謹慎)「刪除」看似簡單,實則關係到數據完整性、恢復能力、主從一致性與效能。根據業務語義選擇正確命令,並建立嚴格的變更管控流程,是 DBA 的基本功。