Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

Удаление связанных записей в 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, остальные таблицы, которые участвуют в запросе, останутся без изменений.

  • 2015-01-24 10:49:55