TRUNCATE TABLE 可快速清空資料表所有資料,保留結構、索引、約束。本文深入比較 TRUNCATE 與 DELETE 的交易日誌、鎖行為、身分識別欄位重置等差異,並列出不可使用 TRUNCATE 的場景。
TRUNCATE TABLE [database_name.[schema_name].] table_name;
| 項目 | TRUNCATE TABLE | DELETE (無 WHERE) |
|---|---|---|
| 速度 | 極快(釋放資料頁) | 較慢(逐列刪除) |
| 交易日誌 | 僅記錄頁釋放 | 每列記錄一筆 |
| 鎖粒度 | 表鎖 + 頁鎖 | 列鎖(可能升級為表鎖) |
| 剩餘頁面 | 不留空頁 | 留下空頁,需背景清理 |
| 身分識別欄位 | 重置為種子值 | 保留現值 |
| 觸發器 | 不觸發 | 觸發 FOR EACH ROW |
| 外鍵參考 | 不可用於被參考表 | 可用 |
| 索引檢視表 | 不可用 | 可用 |
| 複寫發布表 | 不可用 | 可用 |
FOREIGN KEY 參考的表(自參考除外)。上述情況請改用 DELETE。
TRUNCATE:計數器重置為種子值(預設 1)。DELETE:計數器不變,下一筆接續原值。DELETE。USE AdventureWorks;
SELECT COUNT(*) AS BeforeTruncateCount FROM HumanResources.JobCandidate;
TRUNCATE TABLE HumanResources.JobCandidate;
SELECT COUNT(*) AS AfterTruncateCount FROM HumanResources.JobCandidate;
若需保留觸發器、外鍵參考或身分識別值,請用 DELETE;單純清空大表、重置自增 ID、追求極致速度時,TRUNCATE TABLE 是最佳選擇。