「刪除資料表」與「刪除資料表資料」是兩個完全不同的操作。前者移除資料表結構與中繼資料,後者僅清除資料列保留結構。本文詳細比較 DROP TABLE、DELETE、TRUNCATE TABLE 三指令的語法、行為差異與適用場景。
DROP TABLE <資料表名稱>;
| 特性 | DELETE | TRUNCATE TABLE |
|---|---|---|
| 語法 | DELETE FROM <表> [WHERE 條件] | TRUNCATE TABLE <表> |
| 篩選條件 | 支援 WHERE 子句,可刪除特定列 | 不支援,僅能清空整張表 |
| 觸發器 | 啟動 AFTER DELETE 觸發器 | 不啟動觸發器 |
| 識別欄位 (IDENTITY) | 保留當前種子值,下一筆接續遞增 | 重置為種子初始值(預設 1) |
| 交易記錄 | 逐列記錄,大量刪除記錄量大、較慢 | 僅記錄頁面釋放,極速、記錄量極小 |
| 鎖定粒度 | 列鎖定 (可升級為表鎖定) | 表鎖定 / 頁面鎖定 |
| 權限需求 | DELETE 權限 | ALTER 權限 (需 ddladmin 或 db_owner) |
| 外來鍵參考 | 若有 FK 參考則失敗 | 若有 FK 參考則失敗 (需先移除 FK) |
| 回復能力 | 完整記錄,可點對點恢復 | 最小記錄,無法單獨恢復特定列 |
DELETE。TRUNCATE TABLE。DROP TABLE。TRUNCATE TABLE 於 SQL Server 2016+ 支援 WITH (PARTITIONS (1, 3)) 截斷特定分區。DELETE TOP (10000) ... 避免交易記錄暴漲與長時間鎖定。DROP TABLE 前建議先 IF EXISTS 判斷:DROP TABLE IF EXISTS dbo.TempData; (SQL Server 2016+)。理解三者差異,才能在資料維護、效能調校、架構重構中做出正確選擇,避免誤操作導致資料遺失或服務中斷。