TRUNCATE TABLE (Transact-SQL)

從資料表中移除所有資料列,且不記錄個別資料列的刪除動作。TRUNCATE TABLE 類似於不含 WHERE 子句的 DELETE 陳述式;不過,TRUNCATE TABLE 比較快,使用的系統資源和交易記錄資源也比較少。

主題連結圖示Transact-SQL 語法慣例

語法

TRUNCATE TABLE 
    [ { database_name.[ schema_name ]. | schema_name . } ]
    table_name
[ ; ]

引數

  • database_name
    這是資料庫的名稱。

  • schema_name
    這是資料表所屬的結構描述名稱。

  • table_name
    這是要截斷之資料表,或要從中移除所有資料列之資料表的名稱。

備註

相較於 DELETE 陳述式,TRUNCATE TABLE 的優點如下:

  • 使用的交易記錄空間較少。

    DELETE 陳述式每次會移除一個資料列,在交易記錄中,每個刪除的資料列都會記錄一個項目。TRUNCATE TABLE 會取消配置用來儲存資料表資料的資料頁,以移除資料,交易記錄只會記錄頁面的取消配置。

  • 通常會使用較少鎖定。

    當利用資料列鎖定來執行 DELETE 陳述式時,會鎖定資料表中的每個資料列,以便進行刪除。TRUNCATE TABLE 一律會鎖定資料表和頁面,但不會鎖定每個資料列。

  • 零頁面會保留在資料表中,沒有例外。

    在執行 DELETE 陳述式之後,資料表仍可以包含空白頁。例如,當沒有至少一項獨佔 (LCK_M_X) 資料表鎖定時,無法取消配置堆積中的空白頁。如果刪除作業並未使用資料表鎖定,資料表 (堆積) 會包含許多空白頁。對於索引,刪除作業可能會留下空白頁,不過,背景清除處理序很快就會取消配置這些頁面。

TRUNCATE TABLE 會移除資料表中的所有資料列,但會保留資料表結構及其資料行、條件約束、索引等。若要移除資料表的資料之外,還要移除資料表定義,請使用 DROP TABLE 陳述式。

如果資料表包含識別欄位,這個資料行的計數器會重設為定義給這個資料行的初始值。如果未定義任何初始值,就會使用預設值 1。若要識別計數器,請改用 DELETE。

限制

下列狀況的資料表不能使用 TRUNCATE TABLE:

  • FOREIGN KEY 條件約束所參考的資料表。(您可以截斷具有外部索引鍵 (參考其本身) 的資料表)。

  • 參與索引檢視的資料表。

  • 利用交易式複寫或合併式複寫來發行的資料表。

如果資料表含有一或多個這些特性,請改用 DELETE 陳述式。

TRUNCATE TABLE 無法啟動觸發程序,因為作業不會記錄個別的資料列刪除動作。如需詳細資訊,請參閱<CREATE TRIGGER (Transact-SQL)>。

截斷大型資料表

MicrosoftSQL Server 能夠在不保留卸除所需要的所有範圍之同時鎖定的情況下,卸除或截斷含有超出 128 個範圍的資料表。如需詳細資訊,請參閱<卸除和重建大型物件>。

權限

所需要的最小權限是 table_name 的 ALTER。TRUNCATE TABLE 權限預設會授與資料表擁有者、系統管理員 (sysadmin) 固定伺服器角色成員,以及 db_ownerdb_ddladmin 固定資料庫角色的成員,這些權限不能轉讓。不過,您可以將 TRUNCATE TABLE 陳述式納入模組 (如預存程序) 中,再利用 EXECUTE AS 子句,將適當的權限授與模組。如需詳細資訊,請參閱<使用 EXECUTE AS 建立自訂權限集>。

範例

下列範例會移除 JobCandidate 資料表的所有資料。TRUNCATE TABLE 陳述式前後會包含 SELECT 陳述式,以比較結果。

USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO