MySQLのTRUNCATEとDELETEの違いとは?AUTO_INCREMENTの挙動を実例で解説
TRUNCATEとDELETEの基本的な違い
MySQLでは、テーブル構造を残したまますべての行(レコード)を削除したい場合、TRUNCATEコマンドとDELETEコマンドのどちらも使用できます。どちらのコマンドもデータベースからテーブルの構造自体は削除せず、行のみを取り除くという点で共通しています。
しかし、両者には一見わかりにくいながらも非常に重要な違いがあります。それが、AUTO_INCREMENT属性を持つPRIMARY KEYカラムの再初期化に関する挙動です。
DELETEコマンドの場合:連番は続きから始まる
カラムがPRIMARY KEY制約付きのAUTO_INCREMENTとして定義されている場合、DELETEコマンドですべての行を削除しても、テーブルは再初期化されません。そのため、削除後に新しい行を挿入すると、AUTO_INCREMENTの番号は最後に挿入された行の次の値から続けて採番されます。
TRUNCATEコマンドの場合:連番は1からやり直し
一方、TRUNCATEコマンドを使用すると、テーブルはまるで新しく作成されたかのように完全に再初期化されます。つまり、TRUNCATE実行後に新しい行を挿入すると、AUTO_INCREMENTの番号は必ず1から始まります。
実際の動作を確認する例
以下の例で、この違いを具体的に確認してみましょう。
mysql> Create table Testing(Id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, Name Varchar(20));
Query OK, 0 rows affected (0.15 sec)
mysql> Insert into testing(Name) values('Gaurav'),('Rahul'),('Aarav'),('Yashraj'),('Manak');
Query OK, 5 rows affected (0.09 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> Select * from testing;
+----+---------+
| Id | Name |
+----+---------+
| 1 | Gaurav |
| 2 | Rahul |
| 3 | Aarav |
| 4 | Yashraj |
| 5 | Manak |
+----+---------+
5 rows in set (0.00 sec)
まず、5件のデータを挿入しました。ここでDELETEを使ってIdが4以上の行を削除し、その後新しい行を追加してみます。
mysql> Delete from testing where id >=4;
Query OK, 2 rows affected (0.04 sec)
mysql> Insert into testing(Name) values('Harshit'),('Lovkesh');
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> Select * from testing;
+----+---------+
| Id | Name |
+----+---------+
| 1 | Gaurav |
| 2 | Rahul |
| 3 | Aarav |
| 6 | Harshit |
| 7 | Lovkesh |
+----+---------+
5 rows in set (0.00 sec)
注目すべきは、新しく挿入された2行のIdが「4」「5」ではなく「6」「7」になっている点です。これは、DELETEではAUTO_INCREMENTのカウンターがリセットされず、以前の採番履歴が引き継がれていることを示しています。
次に、同じテーブルに対してTRUNCATEを実行してから、再度データを挿入してみます。
mysql> Truncate table testing;
Query OK, 0 rows affected (0.10 sec)
mysql> Insert into testing(Name) values('Harshit'),('Lovkesh'),('Ram'),('Gaurav');
Query OK, 4 rows affected (0.11 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> Select * from testing;
+----+---------+
| Id | Name |
+----+---------+
| 1 | Harshit |
| 2 | Lovkesh |
| 3 | Ram |
| 4 | Gaurav |
+----+---------+
4 rows in set (0.00 sec)
今度は、新しく挿入された行のIdが「1」から順番に採番されています。TRUNCATEによってテーブルが完全にリセットされたことがわかります。
まとめ:使い分けのポイント
| 項目 | DELETE | TRUNCATE |
|---|---|---|
| 全行の削除 | 可能 | 可能 |
| テーブル構造 | 保持される | 保持される |
| AUTO_INCREMENT値 | リセットされない(続きから採番) | リセットされる(1から採番) |
| WHERE句による条件指定 | 可能 | 不可(全行削除のみ) |
| ロールバック | トランザクション内なら可能 | 基本的に不可 |
このように、単にデータを消すだけでなく、「連番をどう扱いたいか」や「条件を絞って削除する必要があるか」といった観点から、DELETEとTRUNCATEを使い分けることが大切です。特に開発環境でのテストデータのリセットにはTRUNCATEが便利ですが、本番環境ではロールバックできない点に十分注意しましょう。
-
MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?
MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970 (
-
MySQLで行を取得する際のAND演算子とOR演算子の違いとは?
MySQLにおけるAND演算子とOR演算子の違いANDとORの違いは次の通りです。ANDは、指定された両方の条件がすべて真(true)でなければ、全体の条件が真になりません。一方、ORは、どちらか一方の条件が真であれば、全体の条件が真になります。サンプルテーブルの作成まず、以下のコマンドでテーブルを作成しましょう。mysql> create table demo70-> (-> id int not null auto_increment primary key,-> name varchar(20),-> age int-> );Query OK, 0 r