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

TRUNCATE TABLE 與 DELETE 差異詳解:效能、鎖機制與限制條件

     編輯:MySQL 綜合教學

TRUNCATE TABLE 可快速清空資料表所有資料,保留結構、索引、約束。本文深入比較 TRUNCATE 與 DELETE 的交易日誌、鎖行為、身分識別欄位重置等差異,並列出不可使用 TRUNCATE 的場景。

語法

TRUNCATE TABLE [database_name.[schema_name].] table_name;

核心差異對照

項目TRUNCATE TABLEDELETE (無 WHERE)
速度極快(釋放資料頁)較慢(逐列刪除)
交易日誌僅記錄頁釋放每列記錄一筆
鎖粒度表鎖 + 頁鎖列鎖(可能升級為表鎖)
剩餘頁面不留空頁留下空頁,需背景清理
身分識別欄位重置為種子值保留現值
觸發器不觸發觸發 FOR EACH ROW
外鍵參考不可用於被參考表可用
索引檢視表不可用可用
複寫發布表不可用可用

優勢總結

  • 交易日誌空間極小:適合大量資料快速清空。
  • 鎖競爭少:不逐列加鎖,減少阻塞。
  • 不留碎片頁:釋放所有資料頁,空間回收徹底。

限制條件(不可使用 TRUNCATE)

  1. 被 FOREIGN KEY 參考的表(自參考除外)。
  2. 參與索引檢視表的表。
  3. 透過交易式或合併式複寫發布的表。

上述情況請改用 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 是最佳選擇。

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