🔖

【MySQL】TRUNCATE と DELETE の違いを整理する

に公開

はじめに

MySQLでデータを削除するとき、DELETETRUNCATE のどちらを使うか迷うことがあります。
一見似ていますが、動作や特徴は大きく異なります。

本記事では、実際のサンプルテーブルを使って両者の挙動を比較し、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(データ定義言語)の略で、テーブルやカラムなどの構造を変更する命令のことです。
例:CREATEALTERDROPTRUNCATE
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 を選ぶのが安心

おわりに

DELETETRUNCATE はどちらも「削除」ですが、挙動や用途は異なります。
特に、AUTO_INCREMENT の扱いROLLBACK の可否は実務で大きな違いとなります。

本記事が、実際の使い分けの参考になれば幸いです。

Discussion