MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでサブクエリのSELECT結果をもとにDELETEを実行する方法

はじめに

MySQLでは、DELETE文のWHERE句で削除対象と同じテーブルを直接サブクエリとして参照すると、「ERROR 1093: You can't specify target table for update in FROM clause」というエラーが発生します。この問題を回避するには、サブクエリ全体を別のサブクエリ(派生テーブル)でラップする方法が有効です。本記事では、実際の手順を例とともに解説します。

テーブルの作成

まず、テーブルを作成します。

mysql> create table DemoTable1947
    (
    Id int,
    Name varchar(20)
    );
Query OK, 0 rows affected (0.00 sec)

レコードの挿入

insertコマンドを使用して、テーブルに複数のレコードを挿入します。

mysql> insert into DemoTable1947 values(101,'Chris');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1947 values(102,'David');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1947 values(103,'Mike');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1947 values(104,'Bob');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1947 values(105,'Sam');
Query OK, 1 row affected (0.00 sec)

レコードの確認

select文でテーブル内のすべてのレコードを表示します。

mysql> select * from DemoTable1947;

以下のような出力が得られます。

+------+-------+
| Id   | Name  |
+------+-------+
|  101 | Chris |
|  102 | David |
|  103 | Mike  |
|  104 | Bob   |
|  105 | Sam   |
+------+-------+
5 rows in set (0.00 sec)

サブクエリを使ったDELETEの実行

サブクエリでselectを実行し、その結果をもとにDELETEを行うクエリは以下の通りです。ポイントは、内側のサブクエリ全体を「as t」という別名を持つ派生テーブルとしてラップしている点です。これにより、MySQLの同一テーブル参照制限を回避できます。

mysql> delete from DemoTable1947 where Id
    IN(select * from (select Id from DemoTable1947 order by Id limit 3)as t);
Query OK, 3 rows affected (0.00 sec)

このクエリでは、Idを昇順に並べ替えた上位3件(101、102、103)のIdをサブクエリで取得し、それらに一致する行を削除しています。

削除後の確認

テーブルのレコードを再度確認してみましょう。

mysql> select * from DemoTable1947;

以下のような出力が得られます。

+------+------+
| Id   | Name |
+------+------+
|  104 | Bob  |
|  105 | Sam  |
+------+------+
2 rows in set (0.00 sec)

このように、Idが101〜103の3件が正常に削除され、残りの2件だけがテーブルに残っていることが確認できます。同じテーブルに対するDELETEとサブクエリを組み合わせる場合は、派生テーブルによるラップを活用すると便利です。

  1. MySQLのFROM句でサブクエリ(派生テーブル)を使う方法をわかりやすく解説

    MySQLでは、SELECT文のFROM句の中にサブクエリ(副問い合わせ)を記述できます。このようなサブクエリは「派生テーブル(Derived Table)」とも呼ばれ、サブクエリの実行結果をあたかも一時的なテーブルであるかのように扱い、その上からさらに条件を指定してデータを取得できる強力な手法です。基本構文SELECT ... FROM(サブクエリ) [AS] 別名 ...;FROM句内のサブクエリには必ず別名(エイリアス)を付ける必要があります。別名がないとエラーになるため、「AS」は省略可能ですが、名前自体は必須です。サンプルデータの確認動作を理解するために、次のテーブル「cars」のデ

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected