Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Типичная задача при разработке web-приложений - удаление объекта и связанных с ним свойств, хранящихся в базе MySQL в разных таблицах. Чаще всего это делается несколькими последовательными запросами, типа
  1. DELETE FROM `item_tableWHERE `item_id`=5
  2. DELETE FROM `properties_tableWHERE `property_parent`=5
  3. DELETE FROM `sizes_tableWHERE `size_parent`=5
и т.д. Главная проблема тут даже не в лишних запросах, а в том, что если на каком-либо промежуточном этапе произойдет критическая ошибка, то в базе останутся "зомби" в виде ни к чему не привязанных записей или наоборот, останется родительская запись, у которой уже удалены все связанные свойства. Оба варианта плохие.

Все эти проблемы легко решаются, если запрос на удаление сформировать в следующем виде:
  1. DELETE
  2. `item_table`, `properties_table`, `sizes_table`
  3. FROM
  4. `item_table`, `properties_table`, `sizes_table`
  5. WHERE `item_id`=5
  6. AND `property_parent`=`item_id`
  7. AND `size_parent`=`item_id`
или, если каких-либо связанных записей в базе может не оказаться:
  1. DELETE
  2. `item_table`, `properties_table`, `sizes_table`
  3. FROM
  4. `item_table`
  5. LEFT JOIN
  6. `properties_tableON (`property_parent`=`item_id`),
  7. `sizes_tableON (`size_parent`=`item_id`)
  8. WHERE `item_id`=
Прелесть такого решения заключается в том, что запрос или выполняется полностью или не выполняется совсем, гарантированно обеспечивая целостность данных. Получается что-то вроде транзакции. Ну и код становится гораздо более понятный и красивый.

Поделиться ссылкой ВКонтакте
Просмотров: 747 | Комментариев: 2

Метки: MySQL
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (31.10.2021 в 20:49):
Транзакции, которые именно транзакции, есть только таблицах InnoDB. Тут же можно смешивать таблицы разных типов. Да и код с одним единственным запросом мне нравится больше.
morgot (31.10.2021 в 20:19):
Решение интересно, но вроде в MySQL есть транзакции? Или в данном случаи они чем-то не подходят? Давно не работал с веб, не помню уже нюансы, или только InnoDB таблицы или как.

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

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0045 сек.) / Память: 4.5 Mb
Наверх