MySQLで複数テーブルのレコードを削除する方法(DELETE文の使い方)
MySQLでは、DELETE文を使用して、条件に一致するレコードをテーブルから削除できます。本記事では、2つのサンプルテーブルを作成し、それぞれから特定のデータを削除する手順を順番に解説します。
サンプルテーブル(DemoTable1)の作成
まず、最初のテーブルを作成しましょう。
mysql> create table DemoTable1 ( Id int, Name varchar(20) ); Query OK, 0 rows affected (0.63 sec)
レコードの挿入
INSERTコマンドを使って、テーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable1 values(1,'Chris'); Query OK, 1 row affected (0.30 sec) mysql> insert into DemoTable1 values(2,'David'); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable1 values(3,'Bob'); Query OK, 1 row affected (0.20 sec)
レコードの確認
SELECT文で、テーブル内のすべてのレコードを表示してみます。
mysql> select *from DemoTable1;
実行結果は以下のとおりです。
+------+-------+ | Id | Name | +------+-------+ | 1 | Chris | | 2 | David | | 3 | Bob | +------+-------+ 3 rows in set (0.00 sec)
サンプルテーブル(DemoTable2)の作成
続いて、2つ目のテーブルを作成します。
mysql> create table DemoTable2 ( ClientId int, ClientName varchar(20) ); Query OK, 0 rows affected (1.19 sec)
レコードの挿入
mysql> insert into DemoTable2 values(101,'Mike'); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable2 values(110,'Bob'); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable2 values(120,'Adam'); Query OK, 1 row affected (0.60 sec)
レコードの確認
mysql> select *from DemoTable2;
実行結果は以下のとおりです。
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 101 | Mike | | 110 | Bob | | 120 | Adam | +----------+------------+ 3 rows in set (0.00 sec)
マルチテーブル削除の実行
それでは、両方のテーブルから「Bob」という名前のレコードを削除します。ここでは、各テーブルに対してDELETE文を実行します。
mysql> delete from DemoTable1 where Name='Bob'; Query OK, 1 row affected (0.23 sec) mysql> delete from DemoTable2 where ClientName='Bob'; Query OK, 1 row affected (0.27 sec)
なお、MySQLにはJOINを利用したマルチテーブルDELETE構文も用意されており、1つのDELETE文で複数のテーブルから同時にレコードを削除することも可能です。
mysql> DELETE DemoTable1, DemoTable2 -> FROM DemoTable1 -> JOIN DemoTable2 ON DemoTable1.Name = DemoTable2.ClientName -> WHERE DemoTable1.Name = 'Bob';
削除結果の確認(DemoTable1)
mysql> select *from DemoTable1;
実行結果は以下のとおりです。「Bob」のレコードが削除されていることがわかります。
+------+-------+ | Id | Name | +------+-------+ | 1 | Chris | | 2 | David | +------+-------+ 2 rows in set (0.00 sec)
削除結果の確認(DemoTable2)
mysql> select *from DemoTable2;
実行結果は以下のとおりです。こちらも「Bob」のレコードが削除されています。
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 101 | Mike | | 120 | Adam | +----------+------------+ 2 rows in set (0.00 sec)
まとめ
このように、DELETE文を使えば条件に一致したレコードを簡単に削除できます。複数のテーブルにまたがるデータを削除したい場合は、①各テーブルに対して個別にDELETE文を実行する方法と、②JOINを組み合わせたマルチテーブルDELETE構文を使う方法の2つがあります。状況や要件に応じて適切に使い分けるとよいでしょう。
-
MySQLでORDER BY FIELD()を使ったカスタムソートを実行する方法
MySQLでカスタムソートを行うにはMySQLで独自の順序に従ってレコードを並び替えたい場合、ORDER BY FIELD() を使用します。FIELD()関数は、指定した値のリストの順番に基づいて各レコードの位置を返すため、任意の順序でのソートが可能になります。まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int -> ); Query OK, 0 rows affected (0.82 sec)サンプルデータの挿入INSE
-
MySQLでサブクエリのSELECT結果をもとにDELETEを実行する方法
はじめにMySQLでは、DELETE文のWHERE句で削除対象と同じテーブルを直接サブクエリとして参照すると、「ERROR 1093: You cant specify target table for update in FROM clause」というエラーが発生します。この問題を回避するには、サブクエリ全体を別のサブクエリ(派生テーブル)でラップする方法が有効です。本記事では、実際の手順を例とともに解説します。テーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1947 ( &nb