Один из вариантов - создать ограничения FOREIGN KEY как DEFERRABLE, а затем установить их DEFERRED для вашей транзакции, чтобы принудительное применение ограничений внешнего ключа откладывалось до COMMIT.
Обратите внимание, что вы не хотите выполнять SELECT, пока содержимое таблиц нарушает ограничения. В некоторых случаях некоторые операторы SELECT возвращают неожиданные или противоречивые результаты. (Обязательно учитывайте операторы SELECT, выполняемые триггерами.)
-- to create foreign key constraints as deferrable
ALTER TABLE my_table ADD CONSTRAINT my_table_fk1
FOREIGN KEY (other_table_id) REFERENCES other_table (id)
DEFERRABLE INITIALLY IMMEDIATE;
-- defer all deferrable constraints until the next commit
ALTER SESSION SET CONSTRAINTS=DEFERRED;
-- or
SET CONSTRAINTS ALL DEFERRED;
-- dml operations may now temporarily violate constraints
INSERT ... ;
UPDATE ... ;
-- you can check the constraints before the commit
SET CONSTRAINTS ALL IMMEDIATE;
-- all deferred constraints will be enforced at the next commit
-- (a fk violation exception will be raised here, rather than by the DML)
COMMIT;
Некоторые полезные ссылки:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:914629004506
http://download.oracle.com/docs/cd/B10500_01/server.920/a96524/c22integ.htm#4666
ДОПОЛНЕНИЯ:
Этот подход относится конкретно к базе данных Oracle и может не применяться к другим механизмам реляционных баз данных.
Предупреждение о выполнении SELECTS для таблиц при отложенных ограничениях применяется только к сеансу, который откладывает ограничения. Другие сеансы будут видеть непротиворечивое состояние, так как они не увидят никаких незафиксированных изменений.
Использование ограничений DEFERRED предпочтительнее, чем отключение и повторное включение ограничений, поскольку отключение ограничений повлияет на все сеансы, а повторная проверка ограничений может потреблять значительные ресурсы (для больших таблиц).