6

私は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".

どうしたの?

4

1 に答える 1

5

INSERT の前にトランザクションを明示的に開いていますか? BEGIN を使用しない場合、各挿入は独立したトランザクションであるため、各コマンドの最後に外部キーが適用されます。

于 2011-04-18T01:19:18.610 に答える