Удаление связанных записей в MySQL одним запросом
В MySQL
есть возможность удалять связанные данные через внешние ключи (foreign key). Но это возможно только для некоторых движков БД (например, InnoDB) и в том случае, если для ключей задано ограничение ON DELETE CASCADE
. В противном случае придется удалять записи вручную. Как раз об этом и пойдет речь в этой заметке.
Допустим у нас есть 2 таблицы: таблица товаров и изображений товаров:
product (id, name, price, description, active)
product_image (id, product_id, src, alt)
И нам необходимо удалить все неактивные товары вместе с изображениями. Для этого придется написать DELETE
запрос с JOIN
-ом и указать таблицы в которых необходимо произвести удаление данных.
Запрос, который решит указанную выше задачу, будет выглядеть следующим образом:
DELETE `p`, `pi` FROM `product` `p` LEFT JOIN `product_image` `pi` ON `pi`.`product_id`= `p`.`id` WHERE `p`.`active` = 0;
Если архитектура базы подразумевает связь еще через таблицу, то добавляем еще один джоин. Запрос удаляет только таблицы указанные после DELETE
, остальные таблицы, которые участвуют в запросе, останутся без изменений.