Вы можете сначала создать таблицы, а затем FK. Например:
create table table1 (
column1 int primary key not null,
column2 int not null,
column3 int not null
);
create table table2 (
column1 int primary key not null,
column2 int not null,
column3 int not null,
constraint fk2
foreign key (column3)
references table1 (column1)
);
alter table table1 add constraint fk1
foreign key (column3)
references table1 (column1);
Даже если таблицы будут созданы, вы не сможете вставить в них данные, так как ограничение не позволит вам создать строку, которая не указывает на другую [несуществующую]] ряд. Чтобы вставить данные, вам нужно создать ограничение как «отложенное». Вот улучшенный SQL-скрипт:
create table table1 (
column1 int primary key not null,
column2 int not null,
column3 int not null
);
create table table2 (
column1 int primary key not null,
column2 int not null,
column3 int not null,
constraint fk2
foreign key (column3)
references table1 (column1) deferrable initially deferred
);
alter table table1 add constraint fk1
foreign key (column3)
references table1 (column1) deferrable initially deferred;
Теперь убедитесь, что вы вставили строки всех задействованных таблиц между границами транзакции. Теперь ограничения будут проверяться только в конце транзакции и не на каждой вставленной / измененной / удаленной строке.