Страницы

Поиск по вопросам

вторник, 6 ноября 2018 г.

Одновременное обновление родительской и дочерней таблицы по ключу

Есть table1 c tab1_id primary key и table2 c tab1_id foreign key. Нужно изменить table1.tab1_id. При попытке изменить tab1_id в любой из таблиц ругается на нарушение целостности:
Update table1 set tab1_id = 22 where tab1_id = 11
ORA-02292: "обнаружена порожденная запись"
Update table2 set tab1_id = 22 where tab1_id = 11
ORA-02292: "Исходный ключ не найден".
Можно ли сделать апдейт сразу в 2 таблицы? Или как обойти это ограничение не внося ограничение в структуру таблицы (без alter table)?


Ответ

Вариант 1:
шаг 1. выключаем внешние ключи(alter table disable constraint)
шаг 2. обновляем данные для обоих таблиц(update table1 set tab1_id = .., update table2)
шаг 3. включаем обратно внешние ключи(alter table enable constraint)
Вариант 2:
Объявляем наш constraint как defferable
alter table table2 add constraint constraint_name foreign key (tab1_id) references table1(tab1_id) deferrable;
Обновление таблицы выполняем в PL\SQL блоке:
begin execute immediate 'set constraint constraint_name deferred'; update table1 ..; update table2 ..; commit; end;
PS:
У вас что-то странное с архитектурой БД. При правильной архитектуре не должно возникать ситуации, когда необходимо править ID

Комментариев нет:

Отправить комментарий