Обсуждение: how to create a record when reference is required

Поиск
Список
Период
Сортировка

how to create a record when reference is required

От
java4dev
Дата:
Hello I have the following problem.
I am trying to create to tables that both reference each other
first try

CREATE TABLE A (
pk_a_id INTEGER NOT NULL,
fk_main_b_id INTEGER NOT NULL,
CONSTRAINT IXP_A PRIMARY KEY (pk_a_id),
CONSTRAINT RFR_MAIN_B FOREIGN KEY (fk_main_b_id) REFERENCES b(pk_b_id)
);

CREATE TABLE B (
pk_b_id INTEGER NOT NULL,
fk_owner_a_id INTEGER NOT NULL,
CONSTRAINT IXP_B PRIMARY KEY (pk_b_id),
CONSTRAINT RFR_MAIN_A FOREIGN KEY (fk_owner_a_id) REFERENCES a(pk_a_id)
);

this does not work as while defining table A, table B is not get
defined. So I changed it to

CREATE TABLE A (
pk_a_id INTEGER NOT NULL,
fk_main_b_id INTEGER NOT NULL,
CONSTRAINT IXP_A PRIMARY KEY (pk_a_id)
);

CREATE TABLE B (
pk_b_id INTEGER NOT NULL,
fk_owner_a_id INTEGER NOT NULL,
CONSTRAINT IXP_B PRIMARY KEY (pk_b_id)
);

ALTER TABLE A ADD CONSTRAINT RFR_MAIN_B FOREIGN KEY (fk_main_b_id)
REFERENCES b(pk_b_id);
ALTER TABLE B ADD CONSTRAINT RFR_MAIN_A FOREIGN KEY (fk_owner_a_id)
REFERENCES a(pk_a_id);

which works. but when trying to insert records
insert into a values (1,1);
insert into b values (1,1);
insert into b values (2,1);

I get

ERROR:  insert or update on table "a" violates foreign key constraint
"rfr_main_b"
DETAIL:  Key (fk_main_b_id)=(1) is not present in table "b".

********** Error **********

ERROR: insert or update on table "a" violates foreign key constraint
"rfr_main_b"
SQL state: 23503
Detail: Key (fk_main_b_id)=(1) is not present in table "b".

which sounds reasonable error but how do I overcome this problem, when
in the same transaction want to insert records in both tables which will
leave database consistent at the end of the transaction.

brg
Nikolas




Re: how to create a record when reference is required

От
Vibhor Kumar
Дата:
On May 3, 2011, at 2:47 PM, java4dev wrote:

> insert into a values (1,1);
> insert into b values (1,1);
> insert into b values (2,1);
>
> I get
>
> ERROR:  insert or update on table "a" violates foreign key constraint "rfr_main_b"
> DETAIL:  Key (fk_main_b_id)=(1) is not present in table "b".
>
> ********** Error **********


Try something like:
BEGIN;
set constraints all deferred;
INSERT statement;
INSERT statement;
COMMIT;

Thanks & Regards,
Vibhor Kumar
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
vibhor.kumar@enterprisedb.com
Blog:http://vibhork.blogspot.com


Fwd: how to create a record when reference is required

От
Willy-Bas Loos
Дата:


---------- Forwarded message ----------
From: Willy-Bas Loos <willybas@gmail.com>
Date: Tue, May 3, 2011 at 12:12 PM
Subject: Re: [NOVICE] how to create a record when reference is required
To: java4dev <java4dev@gmail.com>


It doesn't seem to make sense to do that. What do you gain by it?
But anyway, you might want to try:

ALTER TABLE A ADD CONSTRAINT RFR_MAIN_B FOREIGN KEY (fk_main_b_id) REFERENCES b(pk_b_id) DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE B ADD CONSTRAINT RFR_MAIN_A FOREIGN KEY (fk_owner_a_id) REFERENCES a(pk_a_id) DEFERRABLE INITIALLY DEFERRED;

begin;
insert into a values (1,1);
insert into b values (1,1);
insert into b values (2,1);
commit;

DEFERRED means that the constraint are checked when the transaction ends

HTH,

WBL



ALTER TABLE A ADD CONSTRAINT RFR_MAIN_B FOREIGN KEY (fk_main_b_id) REFERENCES b(pk_b_id);
ALTER TABLE B ADD CONSTRAINT RFR_MAIN_A FOREIGN KEY (fk_owner_a_id) REFERENCES a(pk_a_id);

which works. but when trying to insert records
insert into a values (1,1);
insert into b values (1,1);
insert into b values (2,1);

I get

ERROR:  insert or update on table "a" violates foreign key constraint "rfr_main_b"
DETAIL:  Key (fk_main_b_id)=(1) is not present in table "b".

********** Error **********

ERROR: insert or update on table "a" violates foreign key constraint "rfr_main_b"
SQL state: 23503
Detail: Key (fk_main_b_id)=(1) is not present in table "b".

which sounds reasonable error but how do I overcome this problem, when in the same transaction want to insert records in both tables which will leave database consistent at the end of the transaction.

brg
Nikolas




--
Sent via pgsql-novice mailing list (pgsql-novice@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-novice



--
"Patriotism is the conviction that your country is superior to all others because you were born in it." -- George Bernard Shaw



--
"Patriotism is the conviction that your country is superior to all others because you were born in it." -- George Bernard Shaw