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と組み合わせて使用する方法があります。
また、必要に応じてサブクエリを利用することも可能です。
データの依存関係や参照整合性を考慮しつつ、適切な方法を選択しましょう。