изначально откладываемый в postgresql

#sql #foreign-keys #postgresql #deferrable-constraint

#sql #внешние ключи #postgresql #возможность переноса-ограничение

Вопрос:

У меня есть циклические внешние ключи для 2 таблиц, поэтому я использую изначально отложенный с возможностью переноса, как показано ниже:

 uni=# create table vorlesungen (vnr integer primary key, gelesenvon integer);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "vorlesungen_pkey" for table "vorlesungen"
CREATE TABLE
uni=# create table professoren (pnr integer primary key, lieblingsvo integer);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "professoren_pkey" for table "professoren"
CREATE TABLE
uni=# alter table professoren add constraint vfk foreign key (lieblingsvo) references vorlesungen (vnr) deferrable initially deferred;
ALTER TABLE
uni=# alter table vorlesungen add constraint pfk foreign key (gelesenvon) references professoren (pnr) deferrable initially deferred;
ALTER TABLE
  

пока все хорошо.
но теперь, когда я хочу вставить в таблицы, я получаю нарушения внешнего ключа, хотя я указал изначально отложенный с возможностью переноса:

 uni=# insert into vorlesungen values (1, 1);
ERROR:  insert or update on table "vorlesungen" violates foreign key constraint "pfk"
DETAIL:  Key (gelesenvon)=(1) is not present in table "professoren".

uni=# insert into professoren values (1, 1);
ERROR:  insert or update on table "professoren" violates foreign key constraint "vfk"
DETAIL:  Key (lieblingsvo)=(1) is not present in table "vorlesungen".
  

в чем проблема?

Ответ №1:

Вы явно открываете транзакцию перед вставками? Если вы не используете BEGIN, каждая вставка является независимой транзакцией, поэтому принудительное использование внешних ключей в конце каждой команды.