Lists: | pgsql-bugs |
---|
From: | Bruno Wolff III <bruno(at)cerberus(dot)csd(dot)uwm(dot)edu> |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | Referential integrity checking issue |
Date: | 2001-11-01 17:24:13 |
Message-ID: | 20011101112413.A12473@cerberus.csd.uwm.edu |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-bugs |
I am having a problem where I want to delete all of the existing information
in a database and reinitialize it in a transaction. I am reusing the
primary key values and this results in an error with referential
integrity checking.
I think I have seen something similar to this discussed here previously, but
I am not sure if it was exactly the same problem.
Are things supposed to work like this?
sql commands to reproduce the problem:
create table test1 (col1 int primary key);
create table test2 (col1 int references test1 deferrable);
insert into test1 values (1);
insert into test2 values (1);
begin;
set constraints all deferred;
delete from test1;
delete from test2;
insert into test1 values (1);
insert into test2 values (1);
commit;
drop table test1;
drop table test2;
Output when running the commands with psql:
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'test1_pkey' for table 'test1'
CREATE
NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s)
CREATE
INSERT 1788879 1
INSERT 1788880 1
BEGIN
SET CONSTRAINTS
DELETE 1
DELETE 1
INSERT 1788881 1
INSERT 1788882 1
ERROR: <unnamed> referential integrity violation - key in test1 still referenced from test2
NOTICE: DROP TABLE implicitly drops referential integrity trigger from table "test2"
DROP
DROP
From: | Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> |
---|---|
To: | Bruno Wolff III <bruno(at)cerberus(dot)csd(dot)uwm(dot)edu> |
Cc: | <pgsql-bugs(at)postgresql(dot)org> |
Subject: | Re: Referential integrity checking issue |
Date: | 2001-11-05 16:51:42 |
Message-ID: | 20011105084607.W40711-100000@megazone23.bigpanda.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-bugs |
On Thu, 1 Nov 2001, Bruno Wolff III wrote:
> I am having a problem where I want to delete all of the existing information
> in a database and reinitialize it in a transaction. I am reusing the
> primary key values and this results in an error with referential
> integrity checking.
>
> I think I have seen something similar to this discussed here previously, but
> I am not sure if it was exactly the same problem.
I believe so.
> Are things supposed to work like this?
Not really. What's happening I believe is that it's looking at the final
state of the database and seeing that a row in test2 matches. It then
also needs to determine if a matching row was re-inserted into test1
which it doesn't currently do. Part of the reason for this was a mistake
in reading a piece of the spec that made it appear that such constructs
were illegal, so they weren't coded for.
I have a test patch that I think fixes the base constraint and the no
action referential actions against a 7.2 but it should probably apply
okay against 7.1.x. (I think I sent it to the list a while back,
if not you can write me).