MySQLのDELETE文で複数テーブルのデータを削除する方法

MySQLのDELETE文で複数テーブルのデータを削除する方法

MySQLで複数のテーブルからデータを削除する場合、DELETE文を使って一度に複数のテーブルに対して削除を実行することが可能です。
ただし、単純に複数のテーブルを指定して削除することはできません。
DELETE文をJOINと組み合わせて使用することで、複数のテーブルから関連するデータを一度に削除することができます。

例えば、次のような二つのテーブルがあるとします:

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE
);

CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  customer_name VARCHAR(100)
);

この例では、ordersテーブルとcustomersテーブルがcustomer_idで結びついているとします。
もし、特定のcustomer_idに関連する全てのordersとcustomersのデータを削除したい場合は、次のようにDELETE文を使用できます。

DELETE orders, customers
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.customer_id = 1;

このクエリでは、customer_idが1の顧客に関連するすべての注文 (orders) およびその顧客 (customers) のデータが削除されます。
DELETE文の後に、削除したいテーブルをカンマ区切りで指定し、FROM句でそれらのテーブルが関わるJOIN条件を定義します。
この場合、INNER JOINを使用してordersとcustomersテーブルを結合し、特定のcustomer_idを持つデータを削除しています。

MySQLでは、複数のテーブルを一度に削除する際に、テーブル間の依存関係や参照整合性を考慮する必要があります。
特に、外部キー制約が設定されている場合、親テーブルを削除することで子テーブルのデータも一緒に削除されることがあります。
これを自動的に行う場合は、ON DELETE CASCADEオプションを使用することもできますが、特定の条件下でのみ削除したい場合は、上記のようにJOINを使った削除方法が適しています。

また、JOINを使用する代わりに、サブクエリを利用することも可能です。
例えば、以下のようなサブクエリを用いる方法もあります。

DELETE FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE customer_id = 1);

DELETE FROM customers
WHERE customer_id = 1;

この方法では、まずordersテーブルから該当するcustomer_idのデータを削除し、その後にcustomersテーブルから顧客データを削除しています。
複雑な条件や特定の削除順序が必要な場合に有効です。

まとめ

MySQLで複数のテーブルからデータを削除するには、DELETE文をJOINと組み合わせて使用する方法があります。
また、必要に応じてサブクエリを利用することも可能です。
データの依存関係や参照整合性を考慮しつつ、適切な方法を選択しましょう。