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 ステートメントは、一度に 1 行ずつ削除し、削除した各行のエントリをトランザクション ログに記録します。 TRUNCATE TABLE は、テーブル データを格納するのに使用するデータ ページの割り当てを解除することによってデータを削除し、ページの割り当ての解除だけをトランザクション ログに記録します。
通常、使用されるロックの数が削減されます。
DELETE ステートメントが行ロックを使用して実行される場合、テーブル内の各行は削除対象としてロックされます。 TRUNCATE TABLE は、(スキーマ (SCH-M) ロックを含め) 常にテーブルとページをロックしますが、行はロックしません。
テーブル内にページは一切残されません。
DELETE ステートメントが実行された後には、テーブルに空のページが残る場合があります。 たとえば、少なくとも 1 つの排他 (LCK_M_X) テーブル ロックを使用しない限り、ヒープ内の空のページの割り当てを解除できません。 削除操作がテーブル ロックを使用しない場合は、テーブル (ヒープ) には多数の空のページが含まれます。 インデックスの場合、削除操作によって空のページが残る場合がありますが、これらのページの割り当てはバックグラウンドのクリーンアップ プロセスによってすばやく解除されます。
TRUNCATE TABLE はテーブルからすべての行を削除しますが、テーブル構造と、テーブルの列、制約、インデックスなどは残ります。 テーブルのデータとテーブル定義を削除する場合は、DROP TABLE ステートメントを使用します。
テーブルに ID 列が含まれている場合は、その列に対するカウンターは、その列に対して定義されたシード値にリセットされます。 シードが定義されていなかった場合は、既定値である 1 が使用されます。 ID カウンターを保持するには、代わりに DELETE を使用します。
制限
次のテーブルには TRUNCATE TABLE を使用できません。
FOREIGN KEY 制約で参照されるテーブル (それ自体を参照する外部キーを持つテーブルを切り捨てることができます)
インデックス付きビューで使用されているテーブル
トランザクション レプリケーションとマージ レプリケーションを使用してパブリッシュされているテーブル
これらの特性を 1 つ以上持つテーブルには、代わりに 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