Есть 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
Комментариев нет:
Отправить комментарий