MySQL 複数テーブルを JOIN してデータを削除 (DELETE)
ここでは MySQL で複数のテーブルを JOIN してデータを削除 (DELETE) する方法をご説明します。
サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。
MySQL の DELETE ... JOIN 文の使い方
MySQL でテーブルのデータを削除するには DELETE と JOIN を使います。
基本の DELETE の構文は以下の通りでした。
DELETE
FROM テーブル名
WHERE 条件文;
複数のテーブルを使って削除したい時、MySQL ではテーブルの結合は、普通の SELECT 文のように FROM 句で JOIN します。
そして、DELETE と FROM の間に削除したいデータがあるテーブルを指定します。
例えば、テーブル1 と テーブル2 を id というカラムで INNER JOIN して、テーブル1 のデータを削除したいのであれば次のようにできます。
DELETE t1
FROM テーブル1 AS t1
INNER JOIN テーブル2 AS t2
ON t1.id = t2.id
WHERE 条件文;
テーブルのエイリアスは必須ではありませんが、クエリーが読みやすくなるのでつけています。
DELETE 文で複数のテーブルを JOIN してデータを削除する
それでは、実際にサンプルデータを使ってテーブルを結合して値を削除してみましょう。
次のような、students, exam_results テーブがあり、データは以下のような状態です。
ここで、現時点で exam_results にレコードがない students のレコードを削除したいとします。
DELETE 文を書く前に、間違いがないようにおすすめなのは、まず削除の対象となるデータの SELECT 文を書いてみることです。
exam_results にレコードがない students のレコードは、students テーブルと exam_results テーブルを student_id で LEFT JOIN して、exam_results テーブルの student_id が NULL のレコードを SELECT することで取得できます。
SELECT *
FROM students AS s
LEFT JOIN exam_results AS er
ON s.student_id = er.student_id
WHERE er.student_id IS NULL;
クエリーを実行して、削除したい対象のデータが取得できているか確認します。
student_id = 6 の学生が exam_results テーブルに存在していません。
削除したい対象のデータが取得できていれば、この SELECT 文を元に DELETE 文を作ります。
SELECT * 部分を DELETE に変更します。
DELETE s
FROM students AS s
LEFT JOIN exam_results AS er
ON s.student_id = er.student_id
WHERE er.student_id IS NULL;
WHERE 句の条件文に students テーブルのキーカラムが使われていないので、Safe Updates モードが有効化されている場合はエラーになります。
その場合は、次のクエリーでSafe Updates モードを無効化してから DELETE 文を実行します。
SET sql_safe_updates = 0;
MySQL の Safe Updates モードとは何かと、Safe Updates モードを無効化する方法が知りたい方はこちらをご覧ください。
Safe Updates モードを無効化して DELETE 文を実行し、students テーブルの中身を確認します。
student_id = 6 の学生のレコードが students テーブルから削除されていますね。
以上、MySQL で複数のテーブルを JOIN してデータを削除 (DELETE) する方法をご説明しました。