Shoeisha Technology Media

EnterpriseZine(エンタープライズジン)

EnterpriseZine(エンタープライズジン)

テーマ別に探す

第5回 MySQL事始 SQL文(2) データを変更するSQL文

  2011/07/26 00:00

DELETE

既存の行を削除する場合にはDELETE文を使用します。UPDATE文と同様、一部の行だけを削除することができます。

DELETE文の基本構文
DELETE FROM テーブル名 [WHERE 条件] [その他の条件];

「CityテーブルのIDを降順に並べ替えた時の上位1件を削除する」

mysql> DELETE FROM City ORDER BY ID DESC LIMIT 1;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM City ORDER BY ID DESC LIMIT 3;
+------+----------+-------------+------------+------------+
| ID   | Name     | CountryCode | District   | Population|
+------+----------+-------------+------------+------------+
| 4079 | Rafah    | PSE         | Rafah      |      92020 |
| 4078 | Nablus   | PSE         | Nablus     |     100231 |
| 4077 | Jabaliya | PSE         | North Gaza |     113901 |
+------+----------+-------------+------------+------------+
3 rows in set (0.00 sec)

テーブルの全件を削除する場合には、通常TRUNCATE文を削除します。TRUNCATE文は条件の指定はできませんが、テーブルのデータを全て削除するにはTRUNCATE文はDELETE文よりも圧倒的に高速です。

TRUNCATE文の基本構文
TRUNCATE [TABLE] テーブル名;

以下ではCityテーブルのコピーを作って、DELETE文とTRUNCATE文の性能比較を行っています。

mysql> CREATE TABLE CityCopy_T SELECT * FROM City;
Query OK, 4079 rows affected (0.09 sec)
Records: 4079  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE CityCopy_D SELECT * FROM City;
Query OK, 4079 rows affected (0.08 sec)
Records: 4079  Duplicates: 0  Warnings: 0

mysql> TRUNCATE CityCopy_T;
Query OK, 0 rows affected (0.02 sec)

mysql> DELETE FROM CityCopy_D;
Query OK, 4079 rows affected (0.11 sec)

あまりスペックの良くないノートPC上のVM上でテストしているので、処理時間の絶対値はあまり重要ではありませんが、4,000行ちょっとの小さめのテーブルでも約20ミリ秒対約110ミリ秒と処理時間に明確な差が出てきます。

コラム:テーブルのコピーの作り方

今回のDELETE文とTRUNCATEの性能比較のサンプルで、テーブルをコピーしてテストを行っていますが、テーブルのコピーには2つの方法があります。

テーブルの構成をコピーする
CRETE TABEL テーブル名 LIKE コピー元のテーブル名
テーブルのデータごとコピーする
CRETE TABEL テーブル名 SELECT * FROM コピー元のテーブル名

後者の方がテーブルの作成時にデータもコピーしてくれるので便利ですが、テーブルの構成を厳密にはコピーしてくれないので注意が必要です。以下では元のテーブル構成と、それぞれの構成を使ってコピーされたテーブルの構成を、SHOW CREATE TABLE文を使って確認しています。

SELECT文を使ったコピーではインデックスの定義や列のオプション(ここではID列のAUTO_INCREMENT、エンジンなどの各種設定が抜け落ちてしまうため、使用には注意が必要です。テーブルの構成をそのままコピーし、さらにデータを全てコピーする場合には、LIKEを使って構成をコピーし、INSERT ... SELECT ...で全てデータをコピーする必要があります。

ただし、LIKEを使用している場合でも、AUTO_INCREMENT=4081のようにコピーされない属性情報もあるので注意してください。



著者プロフィール

  • 梶山隆輔(カジヤマリュウスケ)

    日本オラクル株式会社 MySQL Global Business Unit Asia Pacific & Japan担当 MySQL Principal Sales Consultant オラクル社において、MySQLのお客様環境への導入支援や製品の技術解説を担当するセールスコンサルタントチームのアジア太平洋地域リーダー。多国籍なMySQL部門にて、台湾、オーストラリア、インドに在籍するチームメンバーを束ね、アジア太平洋地域の25以上の国や地域でのMySQL普及やビジネスの拡大をミッションとする。  

バックナンバー

連載:MySQL事始

もっと読む

All contents copyright © 2007-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5