TRUNCATE TABLE table_name; DELETE FROM table_name;
-- 建表
CREATE TABLE test_del (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20));
CREATE TABLE test_trunc (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20));
-- 插入 7 筆
INSERT INTO test_del (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');
INSERT INTO test_trunc (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');
-- 清空
DELETE FROM test_del;
TRUNCATE TABLE test_trunc;
-- 重新插入
INSERT INTO test_del (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');
INSERT INTO test_trunc (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');
-- 結果對比
SELECT * FROM test_del; -- id 從 8 開始
SELECT * FROM test_trunc; -- id 從 1 開始
| 維度 | DELETE | TRUNCATE |
|---|---|---|
| 屬性 | DML (Data Manipulation Language) | DDL (Data Definition Language) |
| 執行方式 | 逐行刪除,記錄 undo log | 釋放數據頁,重建表結構 |
| 速度 | 慢(大表極慢) | 極快(元數據操作) |
| AUTO_INCREMENT | 保留最大值+1 | 重置為 1 |
| 觸發器 | 激活 BEFORE/AFTER DELETE | 不激活 |
| 回滾 | 支援 (事務中) | 不支援 (隱含提交) |
| WHERE 條件 | 支援 | 不支援 |
| 鎖粒度 | 行鎖 | 表鎖 (元數據鎖) |
| Binlog 記錄 | 行級記錄每行 | 語句級記錄 (或不記錄) |
| 外鍵約束 | 檢查引用完整性 | 被引用表不可 TRUNCATE |
| 權限需求 | DELETE 權限 | DROP 權限 |
TRUNCATEDELETEWHILE (SELECT COUNT(*) FROM big_table) > 0 DO DELETE FROM big_table WHERE id <= (SELECT MIN(id) FROM big_table) + 999; DO SLEEP(0.1); END WHILE;
理解本質差異,根據業務語義選擇正確工具,避免「清空表卻沒重置自增」或「大表 DELETE 卡死主庫」等生產事故。