Другой способ сделать это - изменить ограничения внешнего ключа так, чтобы проверка ограничения откладывалась до тех пор, пока вы не совершите фиксацию - т.е. вместо того, чтобы Oracle проверял ограничения оператор за оператором, он будет делать это транзакцией -transaction.
Обратите внимание, что вы не можете сделать это с помощью оператора "alter table", но вы можете удалить и заново создать ограничение внешнего ключа для отсрочки, т.е.:
alter table <table name> drop constraint <FK constraint name>;
alter table <table name> add constraint <FK constraint name> foreign key .... initially deferrable;
Как только вы это сделаете, просто обновите таблицы в любом порядке и зафиксируйте - в какой момент, либо:
- Все ваши ограничения ФК выполнены, и все счастливы; или
- Вы где-то нарушили ограничение FK - вы получите ошибку, и вам придется исправить данные и зафиксировать или откатить.
Обратите внимание, что эта функция довольно безопасна, поскольку Oracle не допускает грязного чтения, поэтому они будут видеть результаты ваших обновлений только после того, как вы подтвердите. Таким образом, с точки зрения любого другого сеанса ссылочная целостность представляется сохраненной.
Кроме того, это разовое изменение, поэтому вам не нужно выполнять DDL каждый раз, когда вы хотите обновить первичные ключи.