DELETE из разных таблиц одним запросом

DELETE из разных таблиц одним запросом

Часто встречающаяся ситуация при разработке вэб приложений – как удалить объект из таблицы базы данных и связанные вместе сним объекты, из другой таблицы? Яркий тому пример категории и материалы, пункты меню и их подменю и т.п. Можно, а может и правильно, в таких ситуациях использовать триггеры или даже хранимые процедуры, но как правило PHP программисты не углубляются настолько в дебри SQL, и ваш покорный слуга не исключение. Посмотрим, как можно обойтись простым запросом:


  DELETE
      `menu`, `submenu` 
  FROM
      `menu`
  LEFT JOIN
      `submenu`
  ON
      (`menu`.`id` = `submenu`.`id`)
  WHERE
      `menu`.`id` = 1;

или несколько объектов и их зависимости:


  DELETE
      `menu`, `submenu` 
  FROM
      `menu`
  LEFT JOIN
      `submenu`
  ON
      (`menu`.`id` = `submenu`.`id`)
  WHERE
      `menu`.`id` IN(1,2,3,4);

Таким образом удаляем, например, меню и его подменюхи. Или категорию вместе с содержащимися в ней материалами. Главное не забыть спросить у пользователя подтверждения такого необратимого действия. Прелесть этого варианта в том, что здесь либо удаляется всё что нужно, либо ничего – запрос либо выполняется целмком либо не выполняется вообще. Т.е. нет риска удалить родителя, и при какой либо не предвиденной ошибке оставить в базе его взаимосвязанных потомков, тем самым нарушив целостность данных. Такая своеобразная транзакция...

Добавить комментарий


Защитный код
Обновить






Кто на сайте
Сейчас 40 гостей онлайн