皆さんMySQL使ってますか?今回はテーブルのデータを削除するDELETE文、そこから派生して高速にデータを削除できるTRUNCATE文、テーブルそのものを削除するDROP TABLE文を紹介します。
MySQLを学びはじめの頃は、DELETEしてるのにテーブルが削除できない!とか、DELETEしたら全データが吹き飛んだ!とか色々とあるかと思います。特に削除系の操作はデータが吹き飛ぶ可能性があるので、色々と難しく感じてしまう部分もありますよね。
一度まとめて理解してしまえば、そこまで難しいものでもないので、これを機にサクッと理解してしまいましょう!
テーブルのデータを消す:DELETE文
まずは削除の基本、DELETE文です。DELETE文の書式は次のようになります。
書式
WHERE以下は省略可能ですが、省略した場合、全データが消去されます。ただし、消去されるのはレコードだけで、カラム構造とテーブルそのものは残る点に注意しましょう。
実例を見たほうがわかりやすいので、以下実際にコマンドを入力してテーブルを操作してみましょう。まず、今回扱うデータベースとテーブルを用意します。
CREATE DATABASE delete_db; USE delete_db; CREATE TABLE name_age_list( id INT(11) AUTO_INCREMENT NOT NULL, name VARCHAR(30) NOT NULL COLLATE utf8mb4_unicode_ci, age INT(3) NOT NULL, PRIMARY KEY (id)); INSERT INTO name_age_list (name, age)VALUES ('タロー', '25'), ('ジロー', '23'), ('サブロー', '21'); SELECT * FROM name_age_list;
実行結果
+----+--------------+-----+ | id | name | age | +----+--------------+-----+ | 1 | タロー | 25 | | 2 | ジロー | 23 | | 3 | サブロー | 21 | +----+--------------+-----+ 3 rows in set (0.01 sec)
ここらへんは問題ありませんよね。基礎的な部分に不安のある方は以下の記事を読んで基礎を固めておきましょう。
ではさっそくDELETE文でデータを消していきましょう。まずは基本の使い方、WHERE句で条件を指定してデータを消してみましょう。今回は年齢が22歳以下のデータを消してみます。
DELETE FROM name_age_list WHERE age <=22; SELECT * FROM name_age_list;
実行結果
+----+-----------+-----+ | id | name | age | +----+-----------+-----+ | 1 | タロー | 25 | | 2 | ジロー | 23 | +----+-----------+-----+ 2 rows in set (0.01 sec)
確かに21歳のサブローのデータが削除されました。このように、DELETE文はWHERE句で条件を指定してデータを消去していく使い方が基本になります。
では、WHERE以下を省略して、全件消去をしてみましょう。
DELETE FROM name_age_list; SELECT * FROM name_age_list; DESC name_age_list; SHOW TABLES;
実行結果
Query OK, 2 rows affected (0.02 sec) Empty set (0.00 sec) +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | age | int(3) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) +---------------------+ | Tables_in_delete_db | +---------------------+ | name_age_list | +---------------------+ 1 row in set (0.01 sec)
全件消去の結果、テーブルのデータはすべて消去されてしまいました。(Empty set)ですが、カラムの構造は依然として残っており、テーブルそのものもなくなったわけではありません。
テーブルそのものを消去したい場合は後で紹介するDROP文を、カラムを削除する場合はALTER TABLE DROP文をそれぞれ利用します。
高速にテーブル全体のデータを削除:TRUNCATE文
さて、DELETE文はデータを1件ずつ消去していくコマンドです。そのため、条件指定が柔軟にでき、全体の量も把握できるというメリットがあります。ですが、細かい条件設定は不要で、とにかく全データを素早く消してしまいたい、という場合も時にはあります。
そういった場面では、1件ずつ消去していくDELETE文は速度的に不満が出やすい構文だったりします。とにかく全データをすばやく消去したいんだ!という場面ではDELETE文よりも速度的に有利なTRUNCATE文がおすすめです。
書式は次のようになります。
実際に動かしてみましょう。
INSERT INTO name_age_list (name, age)VALUES ('タロー', '25'), ('ジロー', '23'), ('サブロー', '21'); SELECT * FROM name_age_list; TRUNCATE TABLE name_age_list; SELECT * FROM name_age_list; DESC name_age_list; SHOW TABLES;
実行結果
+----+--------------+-----+ | id | name | age | +----+--------------+-----+ | 4 | タロー | 25 | | 5 | ジロー | 23 | | 6 | サブロー | 21 | +----+--------------+-----+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.07 sec) +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | age | int(3) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) +---------------------+ | Tables_in_delete_db | +---------------------+ | name_age_list | +---------------------+ 1 row in set (0.01 sec)
最初に挿入した3件のデータが全て消去されて、空のテーブルが残ったのが確認できましたか?結果としてはDELETE文による全件消去と同じ結果が得られました。
たった3件のデータでは実感が湧きにくいですが、DELETEよりもかなり高速に全件消去を行うことが可能なのがTRUNCATE文の特徴です。
なぜ速度に差が出るのかというと、DELETEは1件ずつ消去していく方法なのに対して、TRUNCATE文はテーブルそのものを1回削除して、同じテーブルを作り直しています。
このため、特に大量のデータを抱えたテーブルに対してTRUNCATE文はDELETEに比べて速度が出やすいのです。ただし、方法の差により次の3点がDELETEと異なります。
- 削除されたデータの件数がわからない(Query OK, 0 rows affected と表示)
- AUTO_INCREMENTの値がリセットされる
- ロールバックが不可能
特に最後の点は取り返しがつかないという意味で重要です。TRUNCATE文を使う場合は細心の注意を払いましょう。
テーブルそのものを削除:DROP TABLE文
最後にテーブルそのものを消去するDROP TABLE文を紹介します。DROP TABLE文の書式は次のようになります。
では、実際に動かしてみましょう。
SHOW TABLES; DROP TABLE name_age_list; SHOW TABLES;
実行結果
+---------------------+ | Tables_in_delete_db | +---------------------+ | name_age_list | +---------------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.06 sec) Empty set (0.01 sec)
実行前にあったname_age_listテーブルが実行後には消去された(Empty set )のが確認できました。DROP TABLE文について、基本的な使い方はこれで全部なのですが、プログラムの中で使う際に便利なトピックを一つ紹介します。
DROP TABLE文はIF EXISTS句を追加することで、もし指定のテーブルが存在するならば削除する、という動作に切り替えることができます。
書式
SQL文を手作業で打ち込んでいる段階ではありがたみを感じない構文ですが、MySQLをプログラムから制御する段階になると、DROP文でエラーを抑制することができるためよく使われます。
プログラムからテーブルを初期化したくなったときにはこの構文を思い出してください。
データベースの管理に困っているあなたへ
MySQLは世界でもっとも利用されているデータベース管理システムです。大容量のデータに対しても高速で動作し、便利な機能がたくさんあるので、「Yahoo!」や「Google」といった大手企業にも採用されています。
あなたも、MySQLを使って、
- 大規模なデータベースを管理したい!
- データベースを刷新して業務を効率化したい!
- 管理システムの開発案件を受注してフリーランスとして活躍したい!
と考えて学習を始めたのではないでしょうか?MySQLを身に付けることが出来ればこのような案件は全てこなすことができます。
しかし、独学での学習はエラーの連続。思うように学習が進まず困っている方もいらっしゃいますよね。そんな時はプログラミングスクールの受講をおすすめいたします。
手前味噌ではありますが、弊社「侍エンジニア」では学習に躓くポイントを分析して、より効率的にプログラミングを身に付けることができる侍式メソッドを提供しています。
- 最初から最後まで講師が変わらない業界唯一の専属マンツーマン
- あなただけに作成するオリジナルカリキュラム
- フリーランスへの転向までサポートするキャリアカウンセラー
これらを一挙に叶えるのが「マンツマンレッスン」です。効率的に学習を進めてあなたのイメージを実際に具現化してみませんか?
まずは「無料カウンセリング」で業界随一のコンサルタントから、実際の学習プランや仕事獲得方法、今後のキャリアについてなど相談してみませんか?無料カウンセリングを受講いただいた方には、
- 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
- 効率的なオリジナル学習カリキュラム
- 受講料割引クーポン5000円分プレゼント
をプレゼントいたします。オンラインでも受講できるのでお気軽に受講下さい。以下のカレンダーから1分程で予約申し込みできます!
お急ぎの方はこちらからお問い合わせください。
読み込みに失敗しました。
大変お手数ですが、本ページを再度読み込んでください。
再度読み込んでも、読み込み失敗が起こる場合は
こちらからお問い合わせください。
カウンセリングはオンラインにて実施しております。
※予約完了後に、カウンセリングのためのURLやIDなどをメールにてご案内します
1.ご希望の日時を選択してください
2.必須事項を入力してください
ご予約ありがとうございます!
予約が完了しました。ご予約情報とご参加前の準備をご確認ください。
【ご予約情報】○月○日(△) ○○:○○〜
カウンセリング参加に向けてのご準備
※記入いただいたメールアドレスに確認用メールをお送りしておりますのでご確認ください。
※オンラインカウンセリングはGoogle Meetにて実施します。URLが発行したら別途ご案内いたします。
※メールが届かない場合は、SAMURAI ENGINEERサポート(support@sejuku.net)までご連絡ください。
まとめ
いかがでしたか?今回はテーブルの削除について、DELETE文、TRUNCATE文、DROP TABLE文をみてきました。
削除と一口に言ってもデータのみの削除だったり、高速全件削除だったり、テーブルそのものの削除だったりといろいろと違いが理解できたのではないかと思います。
テーブルの削除について、振り返る機会があったらまたこの記事を見直してみてください。この記事が皆様のMySQL学習の一助となれば幸いです。