TRUNCATE TABLE (Transact-SQL)TRUNCATE TABLE (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

個々の行の削除をログに記録せず、テーブルまたはテーブルの指定したパーティションからすべての行を削除します。Removes all rows from a table or specified partitions of a table, without logging the individual row deletions. TRUNCATE TABLE は、WHERE 句を伴わない DELETE ステートメントに似ています。ただし、TRUNCATE TABLE の方が高速で、使用するシステム リソースとトランザクション ログ リソースも少なくなります。TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however, TRUNCATE TABLE is faster and uses fewer system and transaction log resources.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
TRUNCATE TABLE   
    { database_name.schema_name.table_name | schema_name.table_name | table_name }  
    [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }   
    [ , ...n ] ) ) ]  
[ ; ]  
  
<range> ::=  
<partition_number_expression> TO <partition_number_expression>  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }  
[;]  

引数Arguments

database_namedatabase_name
データベースの名前です。Is the name of the database.

schema_nameschema_name
テーブルが所属するスキーマの名前を指定します。Is the name of the schema to which the table belongs.

table_nametable_name
切り捨てるまたはすべての行を削除するテーブルの名前を指定します。Is the name of the table to truncate or from which all rows are removed. table_name はリテラルで指定する必要があります。table_name must be a literal. table_name することはできません、 OBJECT_ID() 関数または変数です。table_name cannot be the OBJECT_ID() function or a variable.

WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )
適用対象: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) から現在のバージョンまで)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)

切り捨てるパーティション、またはすべての行を削除するパーティションを指定します。Specifies the partitions to truncate or from which all rows are removed. テーブルがパーティション分割されていない場合に WITH PARTITIONS 引数を使用すると、エラーが発生します。If the table is not partitioned, the WITH PARTITIONS argument will generate an error. WITH PARTITIONS 句が指定されていない場合、テーブル全体が切り捨てられます。If the WITH PARTITIONS clause is not provided, the entire table will be truncated.

<partition_number_expression> は以下の方法で指定できます。<partition_number_expression> can be specified in the following ways:

  • WITH (PARTITIONS (2)) などのようにパーティション番号を指定しますProvide the number of a partition, for example: WITH (PARTITIONS (2))

  • コンマで区切った複数の個別のパーティションのパーティション番号を提供します。たとえば次のとおりです: WITH (PARTITIONS (1, 5))Provide the partition numbers for several individual partitions separated by commas, for example: WITH (PARTITIONS (1, 5))

  • 範囲と個別のパーティションの両方を提供します。たとえば次のとおりです: WITH (PARTITIONS (2, 4, 6 TO 8))Provide both ranges and individual partitions, for example: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <範囲> はパーティション番号として、TO で区切って指定できます。たとえば次のとおりです。WITH (PARTITIONS (6 TO 8))<range> can be specified as partition numbers separated by the word TO, for example: WITH (PARTITIONS (6 TO 8))

パーティション テーブルの切り捨てを行うには、テーブルとインデックスが連携している (同じパーティション関数でパーティション分割されている) 必要があります。To truncate a partitioned table, the table and indexes must be aligned (partitioned on the same partition function).

RemarksRemarks

DELETE ステートメントと比較して、TRUNCATE TABLE には次の利点があります。Compared to the DELETE statement, TRUNCATE TABLE has the following advantages:

  • トランザクション ログが使用する領域が削減されます。Less transaction log space is used.

    DELETE ステートメントは、一度に 1 行ずつ削除し、削除した各行のエントリをトランザクション ログに記録します。The DELETE statement removes rows one at a time and records an entry in the transaction log for each deleted row. TRUNCATE TABLE は、テーブル データを格納するのに使用するデータ ページの割り当てを解除することによってデータを削除し、ページの割り当ての解除だけをトランザクション ログに記録します。TRUNCATE TABLE removes the data by deallocating the data pages used to store the table data and records only the page deallocations in the transaction log.

  • 通常、使用されるロックの数が削減されます。Fewer locks are typically used.

    DELETE ステートメントが行ロックを使用して実行される場合、テーブル内の各行は削除対象としてロックされます。When the DELETE statement is executed using a row lock, each row in the table is locked for deletion. TRUNCATE TABLE は、(スキーマ (SCH-M) ロックを含め) 常にテーブルとページをロックしますが、行はロックしません。TRUNCATE TABLE always locks the table (including a schema (SCH-M) lock) and page but not each row.

  • テーブル内にページは一切残されません。Without exception, zero pages are left in the table.

    DELETE ステートメントが実行された後には、テーブルに空のページが残る場合があります。After a DELETE statement is executed, the table can still contain empty pages. たとえば、少なくとも 1 つの排他 (LCK_M_X) テーブル ロックを使用しない限り、ヒープ内の空のページの割り当てを解除できません。For example, empty pages in a heap cannot be deallocated without at least an exclusive (LCK_M_X) table lock. 削除操作がテーブル ロックを使用しない場合は、テーブル (ヒープ) には多数の空のページが含まれます。If the delete operation does not use a table lock, the table (heap) will contain many empty pages. インデックスの場合、削除操作によって空のページが残る場合がありますが、これらのページの割り当てはバックグラウンドのクリーンアップ プロセスによってすばやく解除されます。For indexes, the delete operation can leave empty pages behind, although these pages will be deallocated quickly by a background cleanup process.

TRUNCATE TABLE はテーブルからすべての行を削除しますが、テーブル構造と、テーブルの列、制約、インデックスなどは残ります。TRUNCATE TABLE removes all rows from a table, but the table structure and its columns, constraints, indexes, and so on remain. テーブルのデータとテーブル定義を削除する場合は、DROP TABLE ステートメントを使用します。To remove the table definition in addition to its data, use the DROP TABLE statement.

テーブルに ID 列が含まれている場合は、その列に対するカウンターは、その列に対して定義されたシード値にリセットされます。If the table contains an identity column, the counter for that column is reset to the seed value defined for the column. シードが定義されていなかった場合は、既定値である 1 が使用されます。If no seed was defined, the default value 1 is used. ID カウンターを保持するには、代わりに DELETE を使用します。To retain the identity counter, use DELETE instead.

制限Restrictions

次のテーブルには TRUNCATE TABLE を使用できません。You cannot use TRUNCATE TABLE on tables that:

  • FOREIGN KEY 制約で参照されるテーブルAre referenced by a FOREIGN KEY constraint. (それ自体を参照する外部キーを持つテーブルを切り捨てることができます。)(You can truncate a table that has a foreign key that references itself.)

  • インデックス付きビューで使用されているテーブル。Participate in an indexed view.

  • トランザクション レプリケーションとマージ レプリケーションを使用してパブリッシュされているテーブル。Are published by using transactional replication or merge replication.

これらの特性を 1 つ以上持つテーブルには、代わりに DELETE ステートメントを使用します。For tables with one or more of these characteristics, use the DELETE statement instead.

TRUNCATE TABLE では、個別の行の削除がログに記録されないため、この操作によってトリガーをアクティブ化することはできません。TRUNCATE TABLE cannot activate a trigger because the operation does not log individual row deletions. 詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。For more information, see CREATE TRIGGER (Transact-SQL).

Azure SQL データ ウェアハウスAzure SQL Data WarehouseParallel Data WarehouseParallel Data Warehouse では:In Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse:

  • EXPLAIN ステートメントでは TRUNCATE TABLE を使用できません。TRUNCATE TABLE is not allowed within the EXPLAIN statement.

  • TRUNCATE TABLE は、トランザクション内で実行できません。TRUNCATE TABLE cannot be ran inside of a transaction.

大きなテーブルの切り捨てTruncating Large Tables

MicrosoftMicrosoft SQL ServerSQL Server は、削除に必要なすべてのエクステントに対する同時ロックを保持することなく、128 を超えるエクステントを持つテーブルの削除または切り捨てを行う機能を備えています。SQL ServerSQL Server has the ability to drop or truncate tables that have more than 128 extents without holding simultaneous locks on all the extents required for the drop.

アクセス許可Permissions

最小限の権限として table_name に対する ALTER 権限が必要です。です。The minimum permission required is ALTER on table_name. TRUNCATE TABLE 権限は、特に指定のない限り、テーブル所有者、固定サーバー ロール sysadmin、および固定データベース ロール db_owner および db_ddladmin のメンバーに与えられ、譲渡できません。TRUNCATE TABLE permissions default to the table owner, members of the sysadmin fixed server role, and the db_owner and db_ddladmin fixed database roles, and are not transferable. ただし、TRUNCATE TABLE ステートメントをストアド プロシージャなどのモジュール内に組み込み、EXECUTE AS 句を使用してそのモジュールに適切な権限を与えることはできます。However, you can incorporate the TRUNCATE TABLE statement within a module, such as a stored procedure, and grant appropriate permissions to the module using the EXECUTE AS clause.

使用例Examples

A.A. テーブルを切り捨てるTruncate a Table

次の例では、JobCandidate テーブルからすべてのデータを削除しています。The following example removes all data from the JobCandidate table. SELECT ステートメントを TRUNCATE TABLE ステートメントの前後に挿入して結果を比較しています。SELECT statements are included before and after the TRUNCATE TABLE statement to compare results.

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

B.B. テーブル パーティションを切り捨てるTruncate Table Partitions

適用対象: SQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) から現在のバージョンまで)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)

次の例では、パーティション分割されたテーブルの指定パーティションを切り捨てます。The following example truncates specified partitions of a partitioned table. WITH (PARTITIONS (2, 4, 6 TO 8)) 構文によりパーティション番号、2、4、6、7、および 8 が切り捨てられます。The WITH (PARTITIONS (2, 4, 6 TO 8)) syntax causes partition numbers 2, 4, 6, 7, and 8 to be truncated.

TRUNCATE TABLE PartitionTable1   
WITH (PARTITIONS (2, 4, 6 TO 8));  
GO  

参照See Also

DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP TABLE (Transact-SQL) DROP TABLE (Transact-SQL)
IDENTITY (Property) (Transact-SQL)IDENTITY (Property) (Transact-SQL)