TRUNCATE TABLE (Transact-SQL)
從資料表中移除所有資料列,且不記錄個別資料列的刪除動作。 TRUNCATE TABLE 類似於不含 WHERE 子句的 DELETE 陳述式;不過,TRUNCATE TABLE 比較快,使用的系統資源和交易記錄資源也比較少。
語法
TRUNCATE TABLE
[ { database_name .[ schema_name ] . | schema_name . } ]
table_name
[ ; ]
引數
database_name
這是資料庫的名稱。schema_name
這是資料表所屬的結構描述名稱。table_name
這是要截斷之資料表,或要從中移除所有資料列之資料表的名稱。 table_name 必須是常值。 table_name 不能是 OBJECT_ID() 函數或變數。
備註
相較於 DELETE 陳述式,TRUNCATE TABLE 的優點如下:
使用的交易記錄空間較少。
DELETE 陳述式每次會移除一個資料列,在交易記錄中,每個刪除的資料列都會記錄一個項目。 TRUNCATE TABLE 會取消配置用來儲存資料表資料的資料頁,以移除資料,而且交易記錄只會記錄頁面的取消配置。
通常會使用較少鎖定。
當利用資料列鎖定來執行 DELETE 陳述式時,會鎖定資料表中的每個資料列,以便進行刪除。 TRUNCATE TABLE 一律會鎖定資料表 (包括結構描述 (SCH-M) 鎖定) 和頁面,但不會鎖定每個資料列。
零頁面會保留在資料表中,沒有例外。
在執行 DELETE 陳述式之後,資料表仍可以包含空白頁。 例如,當沒有至少一項獨佔 (LCK_M_X) 資料表鎖定時,無法取消配置堆積中的空白頁。 如果刪除作業並未使用資料表鎖定,資料表 (堆積) 會包含許多空白頁。 對於索引,刪除作業可能會留下空白頁,不過,背景清除處理序很快就會取消配置這些頁面。
TRUNCATE TABLE 會移除資料表中的所有資料列,但會保留資料表結構及其資料行、條件約束、索引等。 若要移除資料表的資料之外,還要移除資料表定義,請使用 DROP TABLE 陳述式。
如果資料表包含識別欄位,這個資料行的計數器會重設為定義給這個資料行的初始值。 如果未定義任何初始值,就會使用預設值 1。 若要保留識別計數器,請改用 DELETE。
限制
下列狀況的資料表不能使用 TRUNCATE TABLE:
FOREIGN KEY 條件約束所參考的資料表。 (您可以截斷具有外部索引鍵 (參考其本身) 的資料表)。
參與索引檢視表的資料表。
利用異動複寫或合併式複寫來發行的資料表。
如果資料表含有一個或多個這些特性,請改用 DELETE 陳述式。
TRUNCATE TABLE 無法啟動觸發程序,因為作業不會記錄個別的資料列刪除動作。 如需詳細資訊,請參閱<CREATE TRIGGER (Transact-SQL)>。
截斷大型資料表
Microsoft SQL Server 能夠在不保留卸除所需要的所有範圍之同時鎖定的情況下,卸除或截斷含有超出 128 個範圍的資料表。
權限
所需要的最小權限是 table_name 的 ALTER。 TRUNCATE TABLE 權限預設會授與資料表擁有者、系統管理員 (sysadmin) 固定伺服器角色成員,以及 db_owner 和 db_ddladmin 固定資料庫角色的成員,這些權限不能轉讓。 不過,您可以將 TRUNCATE TABLE 陳述式納入模組 (如預存程序) 中,再利用 EXECUTE AS 子句,將適當的權限授與模組。
範例
下列範例會移除 JobCandidate 資料表的所有資料。 SELECT 陳述式前後會包含在 TRUNCATE TABLE 陳述式前後,以比較結果。
USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO