Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
TRUNCATE
テーブルのすべての行を高速に削除するSQL文です。DELETE文より処理が速く、AUTO_INCREMENTの連番もリセットされます。
構文
-- テーブルの全行を削除します。 TRUNCATE TABLE テーブル名; -- TABLE キーワードは省略可能です(MySQL)。 TRUNCATE テーブル名;
DELETE との違い
| 項目 | TRUNCATE | DELETE(全件) |
|---|---|---|
| 処理速度 | 高速(ログを書き出さない)。 | 低速(行ごとにログを記録)。 |
| WHERE句 | 使用不可(全件削除のみ)。 | 使用可能。 |
| AUTO_INCREMENT | 1にリセットされます。 | リセットされません。 |
| トランザクション | ロールバック不可(DDL文のため)。 | ロールバック可能。 |
| 削除行数の返却 | 返却されません(0 rows affected)。 | 削除した行数が返却されます。 |
| 外部キー制約 | 参照されているテーブルには使用不可。 | 使用可能(制約違反でエラー)。 |
サンプルコード
-- テンポラリデータを格納するテーブルを空にします。 TRUNCATE TABLE temp_import_data; -- ログテーブルを定期的にクリアします。 TRUNCATE TABLE access_logs; -- テスト用テーブルを初期化します(AUTO_INCREMENTも1にリセット)。 TRUNCATE TABLE test_users; -- 外部キー制約を一時的に無効化してTRUNCATEする例(MySQL)。 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE orders; TRUNCATE TABLE order_items; SET FOREIGN_KEY_CHECKS = 1;
実行結果
-- TRUNCATE TABLE temp_import_data; の実行結果
-- Query OK, 0 rows affected (0.03 sec)
-- (行数は常に0と表示されます)
-- TRUNCATE後にINSERTすると、AUTO_INCREMENTは1から始まります。
INSERT INTO test_users (name) VALUES ('テストユーザー');
-- id = 1 が割り当てられます。
データベース別の書き方
『TRUNCATE TABLE』は MySQL・PostgreSQL・Oracle・SQL Server で共通して使用できます。
TRUNCATE TABLE temp_import_data;
PostgreSQL では『TRUNCATE』でトランザクション内のロールバックが可能です(DDLもトランザクション対応)。また、外部キーで参照されているテーブルには『CASCADE』を付けると参照先も同時に削除できます。
-- 参照先テーブルも含めて削除します(PostgreSQL)。 TRUNCATE TABLE orders CASCADE; -- 複数テーブルを一度に削除できます(PostgreSQL)。 TRUNCATE TABLE orders, order_items;
SQLite では『TRUNCATE TABLE』はサポートされていません。『DELETE FROM』で全件削除します。
-- SQLite での全件削除。 DELETE FROM temp_import_data;
概要
『TRUNCATE』はテーブルを再作成に近い形で全行を削除するため、行数が多い場合でも非常に高速です。定期的なログテーブルの初期化や、テストデータのリセットなどに適しています。
『TRUNCATE』はトランザクション(BEGIN / ROLLBACK)の保護外です。実行すると元に戻せないため、必ずバックアップを取得してから実行してください。また、他テーブルから外部キーで参照されているテーブルにはそのままでは使用できません。
条件を指定して一部の行だけを削除したい場合や、ロールバックの必要がある場合は『DELETE』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。