MySQLのDROP TABLEはテーブルを完全に削除する?構造だけ残すTRUNCATEとの違いを徹底解説
MySQLのDROP TABLEとTRUNCATE TABLEの違いとは
MySQLにおけるDROP TABLEコマンドは、テーブルを完全に削除します。テーブル内のすべてのデータに加え、テーブル自体の構造(定義)も削除されるため、実行後はテーブルが存在しない状態になります。
一方、TRUNCATE TABLEコマンドを使用すると、データはすべて削除されますが、テーブルの構造は保持されます。つまり、空のテーブルが再作成されたような状態になります。
この記事では、それぞれのコマンドの動作を実際のSQL例を交えて詳しく確認していきます。
DROP TABLEの動作を確認してみよう
まずは、動作確認用のサンプルテーブルを作成します。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(20)
);
Query OK, 0 rows affected (0.20 sec)
次に、INSERT文でいくつかレコードを挿入します。
mysql> insert into DemoTable(Name) values('Larry');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(Name) values('Chris');
Query OK, 1 row affected (0.05 sec)
SELECT文で全レコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+----+-------+ | Id | Name | +----+-------+ | 1 | Larry | | 2 | Chris | +----+-------+ 2 rows in set (0.00 sec)
DROP TABLEを実行した結果
ここで、DROP TABLEコマンドを実行します。実行後はデータだけでなく、テーブル構造そのものも削除されます。
mysql> DROP TABLE DemoTable; Query OK, 0 rows affected (0.18 sec)
この状態でSELECT文を実行すると、以下のようなエラーが発生します。
mysql> select *from DemoTable; ERROR 1146 (42S02): Table 'hb_student_tracker.DemoTable' doesn't exist
さらに、DESCコマンドでテーブル構造を確認しようとしても、同様にエラーとなります。
mysql> desc DemoTable; ERROR 1146 (42S02): Table 'hb_student_tracker.DemoTable' doesn't exist
このように、DROP TABLEはテーブルの存在そのものを消し去るため、再度使用する場合はCREATE TABLEで作り直す必要があります。
TRUNCATE TABLEの動作を確認してみよう
次に、TRUNCATEコマンドの挙動を確認します。まず新しいテーブルを作成します。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(20)
);
Query OK, 0 rows affected (0.63 sec)
レコードを挿入します。
mysql> insert into DemoTable(FirstName) values('Chris');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.07 sec)
現在のデータを確認します。
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | +----+-----------+ 2 rows in set (0.00 sec)
TRUNCATE TABLEを実行した結果
TRUNCATE TABLEコマンドを実行します。実行後はデータがすべて削除され、テーブル構造のみが残ります。
mysql> TRUNCATE TABLE DemoTable; Query OK, 0 rows affected (0.06 sec)
この状態でSELECT文を実行すると、データは空ですがエラーにはなりません。
mysql> select *from DemoTable; Empty set (0.00 sec)
DESCコマンドでテーブル構造を確認すると、構造はきちんと保持されていることがわかります。
mysql> desc DemoTable;
実行結果:
+-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | Id | int(11) | NO | PRI | NULL | auto_increment | | FirstName | varchar(20) | YES | | NULL | | +-----------+-------------+------+-----+---------+----------------+ 2 rows in set (0.01 sec)
まとめ:DROPとTRUNCATEの使い分けポイント
- DROP TABLE:テーブルのデータと構造の両方を完全に削除する。テーブル自体がなくなるため、復元や参照は不可能。
- TRUNCATE TABLE:データだけを全件削除し、テーブル構造はそのまま維持する。テーブルを空の状態で使い続けたい場合に最適。
なお、大量のデータを削除する場合、TRUNCATEはDELETE文よりも高速に動作するという特徴もあります。用途に応じて、これらのコマンドを適切に使い分けることで、安全かつ効率的なデータベース運用が可能になります。
-
MySQLでテーブルの値をシャッフルする方法:RAND()関数を使ったランダム並び替え
MySQLでテーブル内の値(行)の順序をランダムに入れ替えたい場合は、RAND()関数とORDER BY句を組み合わせることで簡単に実現できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable792 ( Name varchar(100), Subject varchar(100) ); Query OK, 0 rows affected (0.66 sec)レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql> insert into DemoTable79
-
MySQLテーブルからインデックスを削除する方法
MySQLのテーブルから不要になったインデックスを削除したい場合、ALTER TABLE文とDROP INDEX句を組み合わせて使用します。この記事では、実際のSQL実行例を交えながら、インデックスを削除する手順をわかりやすく解説します。 インデックスを削除する基本構文 MySQLテーブルからインデックスを削除する際の基本構文は以下の通りです。 ALTER TABLE テーブル名 DROP INDEX `インデックス名`; インデックス名にスペースが含まれる場合は、バッククォート(`)で囲む点に注意してください。 ステップ1:サンプルテーブルを作成する まずは動作確認用のテーブルを作成しま