【SQL Server】テーブルのデータをサクッと削除!DELETEとTRUNCATE TABLEの違いとは?
SQL Server でテーブル内のすべての行を削除する方法
DELETE ステートメントを使用する
DELETE ステートメントは、テーブルから行を削除するために使用される Transact-SQL (T-SQL) ステートメントです。すべての行を削除するには、WHERE 句を省略します。構文は以下の通りです。
DELETE FROM table_name;
例:
DELETE FROM customers;
このクエリは、customers
テーブル内のすべての行を削除します。
TRUNCATE TABLE ステートメントを使用する
TRUNCATE TABLE ステートメントは、テーブルからすべての行を迅速かつ効率的に削除するために使用される T-SQL ステートメントです。DELETE ステートメントとは異なり、TRUNCATE TABLE はトランザクション ログを生成せず、テーブルの構造 (スキーマ) を保持します。構文は以下の通りです。
TRUNCATE TABLE table_name;
TRUNCATE TABLE customers;
どちらの方法を選択すべきですか?
一般的に、以下の状況に応じていずれかの方法を選択することをお勧めします。
- シンプルで高速な削除が必要な場合: TRUNCATE TABLE ステートメントを使用します。
- 削除操作をログに記録する必要がある場合: DELETE ステートメントを使用します。
- テーブル構造を変更する可能性がある場合: DELETE ステートメントを使用します。
注意事項
- いずれの方法を使用する場合も、削除する前に必ずデータのバックアップを取ってください。
- TRUNCATE TABLE ステートメントはロールバックできないため、注意して使用してください。
- 大規模なテーブルを削除する場合は、パフォーマンス上の理由から TRUNCATE TABLE ステートメントの方が DELETE ステートメントよりも高速になる場合があります。
-- customers テーブルのすべての行を削除する
DELETE FROM customers;
-- customers テーブルのすべての行を削除し、テーブル構造を保持する
TRUNCATE TABLE customers;
このコードを実行する前に、必ずデータのバックアップを取ってください。
- 上記のコードは、AdventureWorks データベースの
customers
テーブルを対象としています。使用するデータベースやテーブル名に合わせて変更する必要があります。 - 実際の操作を行う前に、必ずテスト環境でコードを検証してください。
- テーブルが非常に大きい場合は、DELETE ステートメントを複数回に分けて実行する必要がある場合があります。
- 外部キー制約があるテーブルから行を削除する場合は、DELETE ステートメントで適切な
WHERE
句を指定する必要があります。 - トランザクション内でテーブル行を削除する場合は、DELETE ステートメントを使用する必要があります。
リソース
DROP TABLE ステートメントと CREATE TABLE ステートメントを使用して、テーブルを削除してから再作成することで、テーブル内のすべての行を削除することができます。ただし、この方法は以下の理由で非効率的であり、あまり推奨されません。
- テーブルが非常に大きい場合、削除と再作成に時間がかかる可能性があります。
- テーブルに関連する外部キー制約やインデックスなどのデータベース オブジェクトが削除されないため、手動で削除する必要があります。
-- customers テーブルを削除する
DROP TABLE customers;
-- customers テーブルを再作成する
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
first_name NVARCHAR(50),
last_name NVARCHAR(50),
email NVARCHAR(100)
);
MERGE ステートメントは、2 つのテーブルを比較して、行を挿入、更新、または削除するために使用される T-SQL ステートメントです。空のテーブルと customers
テーブルをマージすることで、customers
テーブル内のすべての行を削除することができます。ただし、この方法は DELETE ステートメントよりも複雑であり、あまり推奨されません。
-- customers テーブルを空のテーブルとマージする
MERGE customers AS target
USING (
SELECT * FROM customers AS source
WHERE 1 = 0
) AS source
ON (1 = 1)
WHEN MATCHED THEN
DELETE;
BULK DELETE ステートメントは、DELETE ステートメントよりも高速に大量の行を削除するために使用される T-SQL ステートメントです。ただし、BULK DELETE ステートメントを使用するには、BULK INSERT コマンドと共に OPENROWSET 関数を使用するなど、追加のセットアップが必要となります。
-- customers テーブルからすべての行を削除する
BULK DELETE customers
FROM 'customers.txt'
WITH (
DATAFILETYPE = 'native',
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
- これらの方法は、DELETE ステートメントまたは TRUNCATE TABLE ステートメントよりも複雑で、パフォーマンス上の問題が発生する可能性があることに注意してください。
sql-server t-sql