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
切り捨てるまたはすべての行を削除するテーブルの名前です。
説明
DELETE ステートメントと比較して、TRUNCATE TABLE には次の利点があります。
トランザクション ログが使用する領域が削減されます。
DELETE ステートメントは、一度に 1 行ずつ削除し、削除した各行のエントリをトランザクション ログに記録します。TRUNCATE TABLE は、テーブル データを格納するのに使用するデータ ページの割り当てを解除することによってデータを削除し、ページの割り当ての解除だけをトランザクション ログに記録します。
通常、使用されるロックの数が削減されます。
DELETE ステートメントが行ロックを使用して実行される場合、テーブル内の各行は削除対象としてロックされます。TRUNCATE TABLE は、常にテーブルとページをロックしますが、行はロックしません。
テーブル内にページは一切残されません。
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)」を参照してください。
大きなテーブルの切り捨て
MicrosoftSQL Server は、削除に必要なすべてのエクステントに対する同時ロックを保持することなく、128 を超えるエクステントを持つテーブルの削除または切り捨てを行う機能を備えています。詳細については、「ラージ オブジェクトの削除と再構築」を参照してください。
権限
最小限の権限として table_name に対する ALTER 権限が必要です。TRUNCATE TABLE 権限は、特に指定のない限り、テーブル所有者、固定サーバー ロール sysadmin、および固定データベース ロール db_owner および db_ddladmin のメンバに与えられ、譲渡できません。ただし、TRUNCATE TABLE ステートメントをストアド プロシージャなどのモジュール内に組み込み、EXECUTE AS 句を使用してそのモジュールに適切な権限を与えることはできます。詳細については、「EXECUTE AS の使用によるカスタム権限セットの作成」を参照してください。
例
次の例では、JobCandidate テーブルからすべてのデータを削除しています。SELECT ステートメントを TRUNCATE TABLE ステートメントの前後に挿入して結果を比較しています。
USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO