BUG #4327: Primary key not refresh after cascaded deleted

Started by Sam Wongover 17 years ago2 messagesbugs
Jump to latest
#1Sam Wong
sam@hellosam.net

The following bug has been logged online:

Bug reference: 4327
Logged by: Sam Wong
Email address: sam@hellosam.net
PostgreSQL version: 8.3.1
Operating system: Linux Debian
Description: Primary key not refresh after cascaded deleted
Details:

Say, I have two table A and B.

That A has one column:
A_primary_col
...and keys:
PRIMARY KEY (A_primary_col)

That B has two columns:
B_primary_col, A_reference
...and keys:
PRIMARY KEY (b_primary_col)
FOREIGN KEY (A_reference) REFERENCES A(A_primary_col) ON DELETE CASCADE

Now I inserted the following records into
into A:
1
2
3

into B:
A,1
B,2
C,3

Now I delete all records from A:
DELETE FROM A;
so that both table is empty now.

Now when I try to insert the following:
into A:
4

Then when I try to insert the following into B:
A,4

Expected Behavior:
it will insert with no problem

Actual Behavior:
it will say
duplicate key value violates unique constraint "B_primary_column_pkey".

Workaround:
Analyze the table B.

I believe that's a bug that the primary key index is not updated
accordingly? Thanks.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Sam Wong (#1)
Re: BUG #4327: Primary key not refresh after cascaded deleted

"Sam Wong" <sam@hellosam.net> writes:

Then when I try to insert the following into B:
A,4
it will say
duplicate key value violates unique constraint "B_primary_column_pkey".

Works for me:

regression=# create table a (A_primary_col int primary key);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
CREATE TABLE
regression=# insert into a values (1),(2),(3);
INSERT 0 3
regression=# create table b (B_primary_col text primary key, a_reference int references a on delete cascade);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
CREATE TABLE
regression=# insert into b values('A',1),('B',2),('C',3);
INSERT 0 3
regression=# DELETE FROM A;
DELETE 3
regression=# select * from a;
a_primary_col
---------------
(0 rows)

regression=# select * from b;
b_primary_col | a_reference
---------------+-------------
(0 rows)

regression=# insert into a values (4);
INSERT 0 1
regression=# insert into b values('A',4);
INSERT 0 1

I suspect a mistake on your part. If you can actually reproduce this
problem, please show an exact test case, not hand-waving.

regards, tom lane