Обсуждение: BUG #3417: Foreign key constraint violation occurs unexpectedly
The following bug has been logged online:
Bug reference: 3417
Logged by: David Boesch
Email address: davidboesch@datasc.com.au
PostgreSQL version: 8.2.4
Operating system: Linux Redhat Linux linux2 2.4.20-8 #1 Thu Mar 13
17:54:28 EST 2003 i686 i686 i386 GNU/Linux
Description: Foreign key constraint violation occurs unexpectedly
Details:
I have created a table with a surrogate primary key like so.
create table reference(
id serial primary key,
name varchar(50) not null,
description varchar(50)
);
Then I create a table which references the primary key like so.
create table a(col1 integer references reference(id));
I add data to reference
select * from reference shows as
id | name | description
----+----------------+--------------------------------
11 | rd | road
12 | st | street
13 | way | way
14 | close | close
15 | bend | bend
3 | vic | victoria
4 | nsw | new south wales
5 | qld | queensland
6 | nt | northern territory
7 | sa | south australia
8 | tas | tasmania
9 | wa | western australia
10 | act | australian captial territory
16 | nab | national australia bank
17 | cba | commonwealth bank of australia
18 | anz | bank of new zealand
19 | westpac | westpack banking corporation
20 | bqld | bank of queensland
21 | mqb | macquarie bank
22 | suncorp | suncorp
1 | unit | unit
2 | lot | lot
23 | assets | assets
24 | liabilities | liabilities
25 | equity | equity
26 | income | income
27 | cost of sales | cost of sales
28 | expenses | expenses
29 | other income | other income
30 | other expenses | other expenses
31 | au | australia
32 | usa | United States of America
33 | oakleigh | oakleigh
34 | st albans | st albans
When inserting into a with the following
dsc=# insert into a (col1) values(7);
ERROR: insert or update on table "a" violates foreign key constraint
"a_col1_fkey"
DETAIL: Key (col1)=(7) is not present in table "reference".
STATEMENT: insert into a (col1) values(7);
ERROR: insert or update on table "a" violates foreign key constraint
"a_col1_fkey"
DETAIL: Key (col1)=(7) is not present in table "reference".
Why do I get a foreign key constraint violation when I have the id of 7 in
the table?
I must be missing something here.
"David Boesch" <davidboesch@datasc.com.au> writes: > I add data to reference > > select * from reference shows as > > id | name | description > ----+----------------+-------------------------------- > 11 | rd | road > 12 | st | street > 13 | way | way > 14 | close | close > 15 | bend | bend > 3 | vic | victoria > 4 | nsw | new south wales > 5 | qld | queensland > 6 | nt | northern territory > 7 | sa | south australia How did you add this data? Given that the ids are out of order I assume you've updated or deleted and re-inserted records a few times? That shouldn't break anything but it's possible the insert on table a doesn't see the same version of this table that you're looking at with the select. Also, just to check that there's nothing wrong with the inex, what do you get if you do: enable_seqscan = off; select * from reference where id = 7; -- Gregory Stark EnterpriseDB http://www.enterprisedb.com
Gregory, Thanks for the reply. The data has been added via a file, as it is static data, no user input for this table, and yes I have run the file many times. I have accidently left some information out however that I believe will probably add some light on this. The data has been added to this table via an inherited table. Reference is the parent or base table, the region table is the child table, I have inserted records into the region table, and hence they go into the base table also. I never specify the id column in my inserts it is a serial column. I have since read some doco that postgres does not support referential integrity with inherited tables (shame this, I love the feature), but was'nt sure under what circumstance. This is most likely why this is not working. This is perhaps not a bug after all, appologies. Tried your query with set enable_seqscan=off and then the result of the query brings back the one row as expected. I'll search around and try to find when and if inhertance will be supported with RI. Thanks again. Regards David On Thu, 2007-06-28 at 22:48, Gregory Stark wrote: > "David Boesch" <davidboesch@datasc.com.au> writes: > > > I add data to reference > > > > select * from reference shows as > > > > id | name | description > > ----+----------------+-------------------------------- > > 11 | rd | road > > 12 | st | street > > 13 | way | way > > 14 | close | close > > 15 | bend | bend > > 3 | vic | victoria > > 4 | nsw | new south wales > > 5 | qld | queensland > > 6 | nt | northern territory > > 7 | sa | south australia > > How did you add this data? Given that the ids are out of order I assume you've > updated or deleted and re-inserted records a few times? That shouldn't break > anything but it's possible the insert on table a doesn't see the same version > of this table that you're looking at with the select. > > Also, just to check that there's nothing wrong with the inex, what do you get > if you do: > > enable_seqscan = off; > select * from reference where id = 7; -- David Boesch 0410452873 95633008 9 Ferntree Gully Rd Oakleigh 3166