刪除資料是資料庫操作的基礎,但 DROP、DELETE、TRUNCATE 三者在機制、效能、副作用上差異極大。誤用可能導致資料遺失、效能雪崩或無法回滾。本文從相同點、核心差異、效能排序、安全性、適用場景、內部機制六大維度徹底釐清。
TRUNCATE、無 WHERE 的 DELETE、DROP 均會清空表內所有資料。| 維度 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 語言分類 | DML (Data Manipulation Language) | DDL (Data Definition Language) | DDL |
| 執行機制 | 逐列刪除,每列寫入交易記錄檔 | 釋放資料頁,僅記錄頁釋放動作 | 刪除物件定義、資料、索引、約束、觸發器 |
| 交易記錄 | 完整記錄,支援 ROLLBACK | 最小化記錄,不可回滾 (隱含提交) | 最小化記錄,不可回滾 |
| 觸發器 | 觸發 AFTER/INSTEAD OF DELETE | 不觸發任何觸發器 | 不觸發 |
| 資料表結構 | 保留 (欄位、索引、約束、權限) | 保留結構,重置身分識別種子 | 完全移除,依賴物件 (SP/Function) 變 INVALID |
| 空間釋放 | 不釋放 Extent,高水位不變 | 預設釋放至 MINEXTENTS,REUSE STORAGE 可保留 | 徹底釋放所有空間 |
| 高水位線 | 維持原位 | 重置至起始位置 | 不存在 |
| 身分識別種子 | 保留現值 | 重置為種子值 | 不存在 |
| WHERE 子句 | 支援 (可刪除部分資料) | 不支援 (全表清空) | 不適用 |
| 適用物件 | Table / View | 僅 Table | Table / View / Index 等 |
| 外鍵約束 | 檢查參考完整性 | 被參考表不可用 (需先刪除 FK) | 連帶刪除約束 |
DROP > TRUNCATE > DELETE
DROP 與 TRUNCATE 為 DDL,隱含提交、不可回滾、不觸發觸發器。SELECT COUNT(*) 確認筆數。
DELETE WHERE ... (確保 Rollback Segment 足夠大)。DROP TABLE。TRUNCATE TABLE (最快)。DELETE FROM table (較慢但安全)。TRUNCATE TABLE ... REUSE STORAGE 後重新匯入資料。AFTER DELETE / INSTEAD OF DELETE。INVALID 狀態 (需重新編譯)。| 誤區 | 事實 |
|---|---|
| TRUNCATE 可以回滾 | 不可回滾 (除非包含在未提交的交易中,但 DDL 會隱含提交前一筆交易) |
| TRUNCATE 不記錄 Log | 記錄「頁釋放」最小化 Log,非完全不記錄 |
| DELETE 不影響索引 | DELETE 必須同步維護所有索引 |
| DROP 只刪資料 | DROP 刪除結構、索引、約束、觸發器、權限 |
| TRUNCATE 可用於被 FK 參考的表 | 不可,必須先移除 FK 約束 |
將 DELETE、TRUNCATE、DROP 視為三種不同「暴力程度」的工具:
根據業務需求、資料量、復原需求選擇正確工具,是 DBA 與開發者的基本功。