概要: このチュートリアルでは、SQL TRUNCATE TABLEステートメントを使用して、テーブル内のすべてのデータを効率的かつ高速に削除する方法を学習します。
SQL TRUNCATE TABLEステートメントの概要

テーブルからすべてのデータを削除するには、`WHERE`句のない`DELETE`ステートメントを使用します。数百万行の大きなテーブルの場合、`DELETE`ステートメントは遅く、効率的ではありません。
大きなテーブルからすべての行を高速に削除するには、次の`TRUNCATE TABLE`ステートメントを使用します。
TRUNCATE TABLE table_name;
Code language: SQL (Structured Query Language) (sql)
この構文では、`TRUNCATE TABLE`句の後に、データを削除する`table_name`を指定します。
MySQLやPostgreSQLなど、一部のデータベースシステムでは、`TABLE`キーワードを省略できるため、`TRUNCATE TABLE`ステートメントは次のように簡単になります。
TRUNCATE table_name;
Code language: SQL (Structured Query Language) (sql)
`TRUNCATE TABLE`ステートメントを発行すると、データベースシステムは、テーブルによって割り当てられたデータページの割り当てを解除することにより、テーブルからすべての行を削除します。これにより、RDBMSはロギング用のリソースと取得する必要があるロックの数を削減できます。
一度に複数のテーブルを切り捨てるには、`TRUNCATE TABLE`句の後に、カンマ区切りのテーブル名のリストを使用します。
TRUNCATE TABLE table_name1, table_name2, ...;
Code language: SQL (Structured Query Language) (sql)
すべてのデータベースシステムがこの形式の`TRUNCATE TABLE`ステートメントをサポートしているわけではありません。サポートしていないものを使用している場合は、複数のテーブルを切り捨てるために、複数の`TRUNCATE TABLE`ステートメントを発行する必要があります。
SQL TRUNCATE TABLEとDELETEの比較
論理的には、`TRUNCATE TABLE`ステートメントと`WHERE`句のない`DELETE`ステートメントは、テーブルからすべてのデータを削除するという同じ効果をもたらします。ただし、いくつかの違いがあります。
- `DELETE`ステートメントを使用すると、データベースシステムは操作をログに記録します。そして、いくつかの努力によって、削除されたデータをロールバックすることができます。ただし、`TRUNCATE TABLE`ステートメントを使用すると、コミットされていないトランザクション内で使用する場合を除き、ロールバックする機会はありません。
- 外部キー制約によって参照されるテーブルからデータを削除するには、`TRUNCATE TABLE`ステートメントを使用できません。この場合は、代わりに`DELETE`ステートメントを使用する必要があります。
- `TRUNCATE TABLE`ステートメントは、テーブルに関連付けられたトリガーがある場合でも、削除トリガーを起動しません。
- 一部のデータベースシステムでは、`TRUNCATE TABLE`ステートメントを実行した後、自動インクリメント列(またはID、シーケンスなど)の値が開始値にリセットされます。`DELETE`ステートメントの場合はそうではありません。
- `WHERE`句を含む`DELETE`ステートメントは、テーブルから部分的なデータを削除しますが、`TRUNCATE TABLE`ステートメントは常にテーブルからすべてのデータを削除します。
SQL TRUNCATE TABLEの例
テーブルを切り捨てる例を見てみましょう。
まず、`big_table`という名前の新しいテーブルを次のように作成します。
CREATE TABLE big_table (
id INT AUTO_INCREMENT PRIMARY KEY,
val INT
);
Code language: SQL (Structured Query Language) (sql)
次に、サンプルデータを`big_table`テーブルに挿入するために、次のステートメントを必要な回数だけ実行します。
INSERT INTO big_table (val)
VALUES
(RAND(100000));
Code language: SQL (Structured Query Language) (sql)
ストアドプロシージャをサポートするデータベースシステムを使用している場合は、このステートメントをループ内に配置できます。たとえば、次のMySQLのストアドプロシージャは、`num`パラメータで指定された行数のデータを`big_table`テーブルにロードします。
DELIMITER $$
CREATE PROCEDURE load_big_table_data(IN num int)
BEGIN
DECLARE counter int default 0;
WHILE counter < num DO
INSERT INTO big_table(val)
VALUES(RAND(1000000));
END WHILE;
END$$
Code language: SQL (Structured Query Language) (sql)
次のステートメントは、`load_big_table_data`ストアドプロシージャを呼び出して、`big_table`テーブルに10,000行を挿入します。
CALL load_big_table_data(10000);
Code language: SQL (Structured Query Language) (sql)
3番目に、`big_table`からすべてのデータを削除するには、次のステートメントを使用します。
TRUNCATE TABLE big_table;
Code language: SQL (Structured Query Language) (sql)
ご覧のとおり、`TRUNCATE TABLE`ステートメントは非常に高速です。
これで、`TRUNCATE TABLE`ステートメントを使用して大きなテーブルからすべてのデータを高速に削除する方法と、`TRUNCATE TABLE`ステートメントと`DELETE`ステートメントの違いを理解できました。