【MySQL】TRUNCATE と DELETE の違いを整理する
はじめに
MySQLでデータを削除するとき、DELETE
と TRUNCATE
のどちらを使うか迷うことがあります。
一見似ていますが、動作や特徴は大きく異なります。
本記事では、実際のサンプルテーブルを使って両者の挙動を比較し、ROLLBACK の可否を確認します。
サンプルテーブルの準備
まずは users
テーブルを作成し、データを挿入します。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO users (name) VALUES ('Alice'), ('Bob');
初期状態は以下の通りです。
+----+-------+
| id | name |
+----+-------+
| 1 | Alice |
| 2 | Bob |
+----+-------+
DELETE 文
DELETE
は、条件を指定して行を削除できる文です。
DELETE FROM users WHERE id = 1;
特徴
- WHERE 句を使って特定の行だけ削除可能
- テーブル全体を削除する場合は WHERE を省略
- 削除後も AUTO_INCREMENT はリセットされない
- トランザクション内で実行すれば ROLLBACK が可能
💡 トランザクションとは?
一連の処理を「ひとまとまり」として扱う仕組みのことです。
途中でエラーが起きたらROLLBACK
で元に戻し、問題なければCOMMIT
で確定できます。
データの整合性を保つための大事な機能です。
実行例
START TRANSACTION;
DELETE FROM users WHERE id = 1;
SELECT * FROM users;
結果:
+----+------+
| id | name |
+----+------+
| 2 | Bob |
+----+------+
→ id = 1
の行が削除されました。
次に ROLLBACK してみます。
ROLLBACK;
SELECT * FROM users;
結果:
+----+-------+
| id | name |
+----+-------+
| 1 | Alice |
| 2 | Bob |
+----+-------+
→ ROLLBACK により削除前の状態に戻りました。
TRUNCATE 文
TRUNCATE
は、テーブルの全データを一気に削除する文です。
TRUNCATE TABLE users;
特徴
- テーブル全体を高速に削除
- WHERE 句は使えない(条件付き削除は不可)
- AUTO_INCREMENT がリセットされる(MySQLの場合)
- DDL(データ定義言語)扱いのため、ROLLBACK はできない
💡 DDLとは?
Data Definition Language(データ定義言語)の略で、テーブルやカラムなどの構造を変更する命令のことです。
例:CREATE
、ALTER
、DROP
、TRUNCATE
。
MySQLのInnoDBでは、TRUNCATEはDDL扱いとなり、暗黙的にCOMMITが実行されるため、
トランザクション内であってもROLLBACKできません。
実行例
START TRANSACTION;
TRUNCATE TABLE users;
SELECT * FROM users;
結果:
Empty set (0.00 sec)
→ 全データが削除されました。
次に ROLLBACK してみます。
ROLLBACK;
SELECT * FROM users;
結果:
Empty set (0.00 sec)
→ ROLLBACK をしてもデータは戻らず、テーブルは空のままです。
違いのまとめ
項目 | DELETE | TRUNCATE |
---|---|---|
削除単位 | 行単位(WHERE 指定可) | テーブル全体 |
WHERE 句 | 使える | 使えない |
AUTO_INCREMENT | リセットされない | リセットされる |
処理速度 | 遅い(行ごと削除) | 速い(一括削除) |
ROLLBACK | 可能(トランザクション内) | 不可(実行後は戻せない) |
使い分けの目安
-
一部の行だけ削除したい →
DELETE
-
テーブルを空にしたい →
TRUNCATE
-
トランザクションで安全に操作したい →
DELETE
を選ぶのが安心
おわりに
DELETE
と TRUNCATE
はどちらも「削除」ですが、挙動や用途は異なります。
特に、AUTO_INCREMENT の扱いやROLLBACK の可否は実務で大きな違いとなります。
本記事が、実際の使い分けの参考になれば幸いです。
Discussion