SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

直近開催のイベントはこちら!

EnterpriseZine Day 2022

2022年6月28日(火)13:10

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けの講座「EnterpriseZine Academy」や、すべてのITパーソンに向けた「新エバンジェリスト養成講座」などの講座を企画しています。EnterpriseZine編集部ならではの切り口・企画・講師セレクトで、明日を担うIT人材の育成をミッションに展開しております。

お申し込み受付中!

MySQL事始

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


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のようにコピーされない属性情報もあるので注意してください。

この記事は参考になりましたか?

  • Facebook
  • Twitter
  • Pocket
  • note
MySQL事始連載記事一覧

もっと読む

この記事の著者

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

EnterpriseZine(エンタープライズジン)
https://enterprisezine.jp/article/detail/3338 2012/02/10 17:36

Job Board

PR

おすすめ

アクセスランキング

アクセスランキング

イベント

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

2022年6月28日(火)13:10

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング