2011-04-18 5 views
5

Tengo un cíclicos claves foráneas en las tablas 2, así que uso diferible diferido inicialmente como a continuación:diferible inicialmente diferidos en PostgreSQL

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 

hasta ahora tan bueno. pero ahora cuando quiero insertar en las tablas, consigo violaciónes de clave externa, aunque he especificado diferible inicialmente diferidos:

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

cuál es el problema?

Respuesta

5

¿Está abriendo explícitamente una transacción antes del INSERTs? Si no utiliza BEGIN, cada inserción es una transacción independiente, por lo tanto aplicando las claves foráneas al final de cada comando.

+0

yup eso es todo, gracias! – hooch