Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление записей при внешнем ключе  (Прочитано 5406 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DrewBlin
Гость
« : 26-07-2009 17:31 » 

Добрый день. Столкнулся с такой проблемой (пока теоритически).
Есть база данных с двумя таблицами. Эти таблицы связаны внешним ключом по одному полю.
Теперь мне надо удалить несколько записей из родительской таблицы и, естественно, из дочерней все их подчиненные записи.
Но важно при удалении дочерних записей не только их удалить, но и посчитать, сколько их было удалено.
Вот и возникает проблема: удалил я записи из дочерней таблицы, посчитал, и пока добирался до удаления родительской записи - кто-то добавил новые дочерние записи. И при удалении родительской записи выйдет ошибка нарушения внешнего ключа.
Как защититься от такой ситуации? Каскадное удаление - не решение, т.к. сильно опасно при ошибочной операции и не даст возможность посчитать кол-во удаленных дочерних записей.
Заранее спасибо.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 26-07-2009 18:23 » 

SELECT ... FOR UPDATE для определения "кол-во удаленных дочерних записей" и каскадное удаление.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #2 : 27-07-2009 05:26 » 

все зависит от сервера
в случае MSSQL можно выставить уровень изоляции (к примеру REPEATABLE_READ),который не позволит добавить записи, пока аидёт обрабтка транзакции
накладные расходы будут больше и тут надо выбрать, что важнее

ещё можно сделать так,
1) создаём таблицу forDeleted
2) перед удалением пишем ключ, который удалем
3) производим удаление дочерних и родительских записе1
4) очищаем таблицу forDeleted
5) в приложении сделать проверку при добавлении, что такого ключа нет в таблице forDeleted, если есть, то генерить ошибку о невозможности добавить новую запись


Записан

I Have Nine Lives You Have One Only
THINK!
DrewBlin
Гость
« Ответ #3 : 27-07-2009 10:36 » new

А ведь оказывается, SELECT ... FOR UPDATE для родительской записи не даст добавить дочернии, если они связаны внешним ключом. По крайней мере так в MySQL. Поэтому перед удалением надо сделать SELECT ... FOR UPDATE одительскую запись и спокойно все удалять. А в местах добавления дочерних поставиь корректную обработку нарушения внешнего ключа.
Я думаю так должно сработать
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines