| 特性 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 操作對象 | 資料列 | 全表資料 | 表結構+資料 |
| 保留結構 | 是 | 是 | 否 |
| WHERE 條件 | 支援 | 不支援 | 不適用 |
| 觸發器 | 觸發 | 不觸發 | 不觸發 |
| 事務安全 | 支援回滾 | 隱式提交,不可回滾 | 隱式提交,不可回滾 |
| 自增計數器 | 不重置 | 重置為 1 | 表不存在 |
| 鎖粒度 | 行鎖 | 表鎖 | 表鎖 |
| 速度 | 慢(逐行刪除、寫 Binlog) | 極快(釋放頁面、極少日誌) | 極快 |
| 回收空間 | 不立即回收(需 OPTIMIZE) | 立即回收 | 立即回收 |
| 權限需求 | DELETE | DROP | DROP |
-- DELETE:可帶條件,可回滾 DELETE FROM `orders` WHERE `created_at` < '2023-01-01'; DELETE FROM `logs`; -- 刪全表,慢 -- TRUNCATE:極速清空,重置自增 TRUNCATE TABLE `logs`; -- DROP:徹底刪除表 DROP TABLE `temp_table`;
OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 回收。DROP TABLE + CREATE TABLE(保留結構)。ON DELETE 觸發器,不寫入 Binlog(STATEMENT 格式記錄一條 Truncate 事件)。TRUNCATE 線上執行(MDL 鎖),不阻塞並發查詢。理解三者在日誌、鎖、觸發器、事務、空間回收、自增計數器上的本質差異,是 DBA 與開發人員的必修課。生產環境操作前務必備份、驗證、分批、可回滾。