Thread: Violation of non existing reference

Violation of non existing reference

From
js@deriva.de
Date:
Hi,

I encountered an odd behaviour when I tried to delete a record.
I have two tables "z_base" and "z_ul". z_base's primary key is "isin"
which is referenced by z_ul.

select count(*) from z_base where isin = 'DE000DB3BTR9';
 count
-------
     1

select count(*) from z_ul where isin = 'DE000DB3BTR9';
 count
-------
     0

So there is no record in z_ul that references z_base with isin
'DE000DB3BTR9', but when I do:

delete from z_base where isin = 'DE000DB3BTR9';
ERROR:  update or delete on table "z_base" violates foreign key
constraint "z_ul_isin_fkey" on table "z_ul"
DETAIL:  Key (isin)=(DE000DB3BTR9) is still referenced from table
"z_ul".

Has anyone an idea how this could happen?

Jan

Re: Violation of non existing reference

From
Tom Lane
Date:
js@deriva.de writes:
> So there is no record in z_ul that references z_base with isin
> 'DE000DB3BTR9', but when I do:

> delete from z_base where isin = 'DE000DB3BTR9';
> ERROR:  update or delete on table "z_base" violates foreign key
> constraint "z_ul_isin_fkey" on table "z_ul"
> DETAIL:  Key (isin)=(DE000DB3BTR9) is still referenced from table
> "z_ul".

> Has anyone an idea how this could happen?

What PG version is this?  Are the two columns of identical datatypes?
(I'm wondering about possible funny effects from blank-padding rules,
for example, if one is char and the other is text or varchar.)
You might also try REINDEXing both tables just in case the problem is a
corrupt index.

            regards, tom lane

Re: Violation of non existing reference

From
js@deriva.de
Date:
It's Version 8.3.
Both columns are of a user defined datatype which is a varchar(12)
with a special check.
I already did a REINDEX but it didn't help.


On 6 Mrz., 18:27, t...@sss.pgh.pa.us (Tom Lane) wrote:
> What PG version is this?  Are the two columns of identical datatypes?
> (I'm wondering about possible funny effects from blank-padding rules,
> for example, if one is char and the other is text or varchar.)
> You might also try REINDEXing both tables just in case the problem is a
> corrupt index.

Re: Violation of non existing reference

From
Tom Lane
Date:
js@deriva.de writes:
> It's Version 8.3.
> Both columns are of a user defined datatype which is a varchar(12)
> with a special check.

You mean a DOMAIN, or you mean a special datatype with custom C code?
If the latter, I'd suspect the C code.  8.3 has more stringent coding
rules for variable-length datatypes than prior releases did.

            regards, tom lane

Re: Violation of non existing reference

From
js@deriva.de
Date:
Sorry, I was wrong. It's a charachter(12) not a varchar and it's a
domain.
The isins in z_ul either start with 'DE000' or with 'CH003'. PG seems
to compare only the first few charachters because when I set the
reference to CASCADE all z_ul entries that start with 'DE000' are
deleted. I tested it in another 8.3 database with the same effect but
it works well with our old 8.2.6 db.


On 6 Mrz., 22:54, t...@sss.pgh.pa.us (Tom Lane) wrote:
> You mean a DOMAIN, or you mean a special datatype with custom C code?
> If the latter, I'd suspect the C code.  8.3 has more stringent coding
> rules for variable-length datatypes than prior releases did.

Re: Violation of non existing reference

From
Tom Lane
Date:
js@deriva.de writes:
> Sorry, I was wrong. It's a charachter(12) not a varchar and it's a
> domain.
> The isins in z_ul either start with 'DE000' or with 'CH003'. PG seems
> to compare only the first few charachters because when I set the
> reference to CASCADE all z_ul entries that start with 'DE000' are
> deleted. I tested it in another 8.3 database with the same effect but
> it works well with our old 8.2.6 db.

Can you put together a self-contained test case?

            regards, tom lane