MySQLのTRUNCATEとDROPコマンドの違いとは?構造とデータへの影響を徹底解説
MySQLにおけるTRUNCATEとDROPの最大の違い
MySQLのTRUNCATEコマンドとDROPコマンドの最も重要な違いは、テーブル構造を保持するかどうかという点にあります。
- TRUNCATE:テーブル内の全データ(行)を削除しますが、テーブル自体の構造はそのまま残ります。また、AUTO_INCREMENTのカウンターも初期化されます。
- DROP:テーブルのデータだけでなく、テーブル構造そのものもデータベースから完全に削除します。
それぞれのコマンドを実行した後の挙動を、実際の例で確認してみましょう。
検証用テーブルの作成とデータ投入
まず、「testing」というテーブルを作成し、サンプルデータを挿入します。
mysql> Create table testing(id int PRIMARY KEY NOT NULL AUTO_INCREMENT,Name Varchar(20));
Query OK, 0 rows affected (0.24 sec)
mysql> Insert into testing(Name) Values('Ram'),('Mohan'),('John');
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> Select * from testing;
+----+-------+
| id | Name |
+----+-------+
| 1 | Ram |
| 2 | Mohan |
| 3 | John |
+----+-------+
3 rows in set (0.00 sec)
この時点で、id列はPRIMARY KEYかつAUTO_INCREMENTが設定されています。
TRUNCATE実行後の状態
TRUNCATEコマンドで「testing」テーブルの中身を空にしても、テーブル構造はデータベース内に残り、PRIMARY KEYやAUTO_INCREMENTの設定も維持されます。さらに、AUTO_INCREMENTの値は1に初期化されるため、次に挿入する行のidは再び1から始まります。
mysql> Truncate table testing; Query OK, 0 rows affected (0.04 sec) mysql> DESCRIBE testing; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | Name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.21 sec)
DESCRIBEの結果を見ると、テーブル定義が完全に残っていることがわかります。
DROP実行後の状態
一方、DROPコマンドを実行すると、テーブルのデータだけでなく構造そのものもデータベースから削除されます。そのため、その後テーブルを参照しようとするとエラーが発生します。
mysql> Drop table testing; Query OK, 0 rows affected (0.08 sec) mysql> DESCRIBE testing; ERROR 1146 (42S02): Table 'query.testing' doesn't exist
「Table doesn't exist(テーブルが存在しない)」というエラーが出ることから、テーブルが完全に消去されたことが確認できます。
まとめ:使い分けのポイント
| 項目 | TRUNCATE | DROP |
|---|---|---|
| データの削除 | 全行削除 | 全行削除 |
| テーブル構造 | 保持される | 削除される |
| AUTO_INCREMENT | 初期化される | ―(テーブルごと消失) |
| 主な用途 | テーブルを再利用しつつ中身だけ空にしたい場合 | テーブル自体が不要になった場合 |
このように、テーブルを今後も使い続けるならTRUNCATE、テーブル自体が不要ならDROPという使い分けが基本です。どちらのコマンドも元に戻せない破壊的な操作なので、実行前には必ずバックアップを取ることをおすすめします。
-
MySQLのTINYINT(1)とブール型(BOOLEAN)の違いとは?
結論から言うと、TINYINT(1)とブール型(BOOLEAN)の間に違いはありません。MySQLでは、BOOLまたはBOOLEANというキーワードは内部的にTINYINT(1)へと変換されます。つまり、BOOLやBOOLEANはTINYINT(1)の別名(シノニム)として扱われるのです。それでは、実際にテーブルを作成して確認してみましょう。BOOLEAN型でテーブルを作成するmysql> create table DemoTable ( isMarried Boolean ); Query OK, 0 rows affected (1.77 sec)次に、作成したテーブルの構造
-
MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?
MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970 (