Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2009, 21:10   #1
DrewBlin
 
Регистрация: 26.07.2009
Сообщений: 5
По умолчанию Удаление записей при внешнем ключе

Добрый день. Столкнулся с такой проблемой (пока теоритически).
Есть база данных с двумя таблицами. Эти таблицы связаны внешним ключом по одному полю.
Теперь мне надо удалить несколько записей из родительской таблицы и, естественно, из дочерней все их подчиненные записи.
Но важно при удалении дочерних записей не только их удалить, но и посчитать, сколько их было удалено.
Вот и возникает проблема: удалил я записи из дочерней таблицы, посчитал, и пока добирался до удаления родительской записи - кто-то добавил новые дочерние записи. И при удалении родительской записи выйдет ошибка нарушения внешнего ключа.
Как защититься от такой ситуации? Каскадное удаление - не решение, т.к. сильно опасно при ошибочной операции и не даст возможность посчитать кол-во удаленных дочерних записей.
Заранее спасибо.
DrewBlin вне форума Ответить с цитированием
Старый 26.07.2009, 22:21   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну и для общей картины нужно бы еще написать на чем шуршит ваша базенка
soleil@mmc вне форума Ответить с цитированием
Старый 27.07.2009, 11:31   #3
DrewBlin
 
Регистрация: 26.07.2009
Сообщений: 5
По умолчанию

База работает на пока MySQL. Но это не особо принципиально. В ближаешем будущем будет миграция на что-то другое (пока не ясно что)...
DrewBlin вне форума Ответить с цитированием
Старый 27.07.2009, 13:44   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

на Оракле можно c помощью неявного курсора так получить
Код:
declare 
  l_cnt numberl
begin
  delete from your_table
  where ....;
  l_cnt:=sql%rowcount;
end;
вот пример прям из доки
Код:
CREATE TABLE employees_temp AS SELECT * FROM employees;

DECLARE
  mgr_no NUMBER(6) := 122;
BEGIN
  DELETE FROM employees_temp WHERE manager_id = mgr_no;
  DBMS_OUTPUT.PUT_LINE('Number of employees deleted: ' || TO_CHAR(SQL%ROWCOUNT));
END;
/
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каскадное удаление записей Liones БД в Delphi 7 14.05.2009 08:04
Удаление нескольких записей Hobbit_88 БД в Delphi 5 23.04.2009 17:18
Удаление повторяющихся записей gavrylyuk Microsoft Office Excel 3 28.06.2008 08:10
Удаление записей Blackmore БД в Delphi 2 26.05.2008 08:18
Удаление записей Arsgun БД в Delphi 7 09.07.2007 11:56