首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server TRUNCATE、DELETE、DROP 三大刪除指令差異總表與選擇指南

     編輯:關於SqlServer

三者皆會移除資料,但機制、效能、可回復性、觸發器行為截然不同。選錯指令可能導致資料遺失、效能災難或無法回滾。

核心差異總表

特性DELETETRUNCATEDROP
語言分類DML (資料操作)DDL (定義)DDL (定義)
可回滾 (ROLLBACK)是 (寫入記錄檔)否 (最小記錄,立即認可)否 (立即認可)
觸發器啟動 AFTER/INSTEAD OF不啟動不啟動
WHERE 條件支援不支援 (全表)不適用
身分識別欄位重置否是 (重種子為 1)表不存在
空間釋放否 (高水位不變)預設釋放至 MINEXTENTS (可 REUSE STORAGE)完全釋放 (含索引、約束、觸發器)
高水位線不動重置至開頭表消失
速度 (大表)慢 (逐列記錄)極快 (僅記錄頁釋放)極快 (僅更新系統表)
外鍵約束檢查被參考時失敗級聯刪除約束
權限需求DELETE 權限ALTER 權限CONTROL/DROP 權限

選擇指南

  • 刪除部分列 → DELETE WHERE ... (記得備份、大量分批)。
  • 清空整表、保留結構、需重置 IDENTITY、不需觸發器、可接受不可回滾 → TRUNCATE TABLE (最快)。
  • 永久移除表結構與資料 → DROP TABLE。
  • 需觸發器審計、需交易回滾、需保留高水位** → DELETE (無 WHERE 等同 TRUNCATE 但可回滾)。
  • 整理碎片並保留資料** → TRUNCATE ... REUSE STORAGE + 重新匯入 (極少用)。

常見誤區

  1. 「TRUNCATE 不可回滾」≠ 「TRUNCATE 不在交易中」** → TRUNCATE 在交易內執行時,若交易回滾,**SQL Server 2005+ 可回滾 TRUNCATE** (系統表操作可回滾),但記錄檔仍為最小記錄。
  2. 「DELETE 不釋放空間」→ 後續 INSERT 會重用頁面,空間不會浪費,只是高水位不退縮。
  3. 「DROP 後資料找不回」→ 僅能從備份還原,或使用第三方記錄檔讀取工具 (極高成本)。

結語

DELETE = 精準手術刀 (可回滾、觸發器、慢);TRUNCATE = 核爆清空 (極快、重置 IDENTITY、不可回滾);DROP = 連根拔起 (結構連帶消失)。依業務需求精準選擇,切勿混淆。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved