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

T-SQL 清空資料表:TRUNCATE TABLE 與 DELETE 差異深度解析

     編輯:關於SqlServer

在 SQL Server 中清空資料表資料,最常用的兩個指令是 TRUNCATE TABLE 與 DELETE FROM table(無 WHERE 條件)。雖然結果皆為「移除所有資料列」,但底層機制、效能、日誌記錄與限制條件有本質差異。

核心差異快速比較

特性TRUNCATE TABLEDELETE
執行速度極快(僅記錄頁面釋放)較慢(逐列記錄刪除)
交易日誌最小化記錄(僅記錄分頁釋放)完整記錄每列刪除操作
Identity 重置自動重置 種子值保留目前種子值
觸發器不觸發 DELETE 觸發器觸發 AFTER/INSTEAD OF DELETE
外鍵限制不可用 若被 FK 參考可用(需符合 FK 規則)
WHERE 條件不支援支援條件式刪除
權限需求ALTER 權限DELETE 權限
資料頁鎖定鎖定整張表與分頁逐列鎖定(可升級為表鎖)
回滾支援支援(在交易中)支援

TRUNCATE TABLE 適用場景

  • 快速清空大型資料表(百萬列以上)
  • ETL 流程中暫存表每批次重載前清空
  • 需重置 Identity 種子值
  • 無外鍵參考、無 DELETE 觸發器相依

DELETE 適用場景

  • 需保留 Identity 種子值
  • 表被外鍵參考(需先停用 FK 或用 DELETE)
  • 需觸發 DELETE 觸發器執行稽核邏輯
  • 需條件式刪除(配合 WHERE)
  • 小資料量表,日誌成本可接受

實戰範例

-- 建立測試表
CREATE TABLE dbo.TestTruncate (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    DataCol VARCHAR(100)
);
INSERT INTO dbo.TestTruncate (DataCol) VALUES ('A'), ('B'), ('C');
-- Identity 目前種子 = 3

-- 使用 TRUNCATE
TRUNCATE TABLE dbo.TestTruncate;
-- Identity 重置為 1,下次插入 ID = 1

-- 重新插入測試
INSERT INTO dbo.TestTruncate (DataCol) VALUES ('X'), ('Y');
-- 使用 DELETE
DELETE FROM dbo.TestTruncate;
-- Identity 保持種子 = 3,下次插入 ID = 3

進階技巧:有 FK 參考仍想用 TRUNCATE

SQL Server 不允許直接 TRUNCATE 被 FK 參考的表。解決方案:

  1. 暫時停用 FK:ALTER TABLE ChildTable NOCHECK CONSTRAINT FK_Name
  2. 執行 TRUNCATE TABLE ParentTable
  3. 重新啟用 FK:ALTER TABLE ChildTable CHECK CONSTRAINT FK_Name

或使用 DELETE FROM ParentTable 搭配 DBCC CHECKIDENT ('ParentTable', RESEED, 0) 手動重置 Identity。

總結建議

優先使用 TRUNCATE TABLE 清空完整資料表,效能最佳、日誌最小、自動重置 Identity。僅在有外鍵、觸發器相依或需條件刪除時,改用 DELETE。

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