1. TRUNCATE語法是什麼
TRUNCATE語法的基本概念
MySQL 的 TRUNCATE 語法是一個用來一次刪除資料表中所有資料的指令。與逐筆刪除的 DELETE 語法不同,TRUNCATE 是透過內部重新建立資料表的方式來刪除資料。因此,在需要快速清除大量資料時特別有效。
基本語法
TRUNCATE 的基本語法如下:
TRUNCATE TABLE 資料表名稱;
執行後,指定的資料表中所有資料列會被刪除,資料表回到初始狀態。但要注意的是,刪除後的資料無法復原,因此使用時需特別小心。
範例:基本用法
以下範例建立一個名為 users
的資料表,並使用 TRUNCATE 將所有資料刪除:
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');
-- 執行 TRUNCATE
TRUNCATE TABLE users;
-- 資料表會被清空,AUTO_INCREMENT 也會重設。
在這個例子中,資料表的所有資料都被刪除,之後再新增資料時,id
欄位會重新從 1 開始。

2. TRUNCATE 與 DELETE 的差異
速度與效能差異
TRUNCATE 專為清空整個資料表設計,因此比 DELETE 語法快得多。DELETE 是逐筆刪除,當資料筆數龐大時,處理速度會明顯變慢;相對地,TRUNCATE 透過重新建立資料表來刪除資料,非常適合大量資料的清除。
範例:效能比較
刪除數百萬筆資料時,DELETE 的語法如下:
DELETE FROM users WHERE condition;
相對地,使用 TRUNCATE 可以一次清空所有資料:
TRUNCATE TABLE users;
當資料表規模龐大時,差異特別明顯。DELETE 可能需要很長時間,而 TRUNCATE 幾乎能瞬間完成。
回滾差異
TRUNCATE 無法回滾。一旦執行,資料會永久刪除且無法復原。相對地,DELETE 在交易 (transaction) 中使用時,若過程發生錯誤,可以回滾並恢復資料。這一點在資料安全上非常重要。
選擇性刪除的差異
DELETE 語法可以搭配 WHERE
條件刪除特定資料列,但 TRUNCATE 無法做到。例如,要刪除特定使用者資料時應使用 DELETE:
DELETE FROM users WHERE id = 1;
由於 TRUNCATE 只能刪除所有資料列,因此當僅需刪除部分資料時,DELETE 更為適合。
3. TRUNCATE 對 AUTO_INCREMENT 的影響
AUTO_INCREMENT 的重設
執行 TRUNCATE 後,資料表會清空,並且 AUTO_INCREMENT 會被重設。新增資料時,ID 會重新從 1 開始。例如在 users
資料表新增資料:
INSERT INTO users (name) VALUES ('Ken');
-- id 會重新從 1 開始
雖然這在某些情境下很方便,但若 ID 被其他資料表作為外鍵使用,可能造成資料不一致。因此在使用 TRUNCATE 前需要特別注意。
4. 使用 TRUNCATE 的注意事項
資料不可復原
TRUNCATE 的最大風險在於資料無法復原。若誤刪重要資料,將無法挽回,因此在執行前務必做好備份。
外鍵限制
若資料表設有外鍵約束,TRUNCATE 無法直接使用。這種情況下,必須先移除外鍵約束,或以其他方式處理相關資料。
執行權限限制
執行 TRUNCATE 需要具備刪除資料表 (DROP) 的權限。若使用者沒有相關權限,將無法執行此指令,因此務必先確認權限設定。

5. TRUNCATE 與 DELETE 的使用情境
適合使用 TRUNCATE 的情境
當需要一次性清空整個資料表時,TRUNCATE 是最佳選擇。特別是在需要快速刪除所有資料,或希望重設 AUTO_INCREMENT 的情況下,TRUNCATE 非常實用。例如在測試環境中,每次需要重設測試資料時就很適合使用。
適合使用 DELETE 的情境
若需要選擇性刪除資料列,或必須觸發觸發器 (trigger),則應使用 DELETE。DELETE 更適合在維持資料一致性與安全性的前提下進行精確刪除。
6. 安全使用 TRUNCATE 的最佳實務
備份的重要性
在執行 TRUNCATE 之前,務必先做好資料備份。因為資料一旦刪除將無法挽回,特別是在正式環境中更要謹慎。
先在測試環境驗證
建議在正式環境執行前,先於測試環境進行驗證。這樣可以確認語法符合預期,避免出現不可預期的問題。
管理 AUTO_INCREMENT 欄位
由於 TRUNCATE 會重設 AUTO_INCREMENT,因此在需要保持唯一 ID 的情況下,應事先檢查其他資料表的關聯,並做好備份,確保不會產生資料衝突。