Thread: spurious "UNIQUE constraint matching given keys for referenced table" error

spurious "UNIQUE constraint matching given keys for referenced table" error

From
"Mathew Frank"
Date:
Hello people,
I'm a newbie to this list (though I've been hanging around on the ODBC list
for some time and I've been working with pgSQL for about 8months) so go
easy? ;-)

I realise this error is to stop a bad foreign key reference being created.
However I have a table with a multi-column primary key, and no matter what I
do I cannot create the FK to it from another table.  I have tried adding a
unique index and this makes no difference.    Having spent a lot of time
researching this, as I understand it either of these should stop this
message appearing.

I do have other tables in my db with these multiple-column keys and FKs to
them with no ill effects.

I am using 7.2, compiled  686 optimised, with GCC 2.96

Can anyone offer a suggestion as to a work around - or of course tell me I'm
and idiot and I've overlooked something ;-)   I have tried dumping and
reloading the database a number of times.

DEFINITIONS:
==============
CREATE TABLE "price_lists" (
"s_fk_price_list_id" char(3) NOT NULL,
"d_effective_date" date NOT NULL,
"s_caption" varchar(30),
"s_fk_price_list_include" char(3),
CONSTRAINT "price_lists_pkey" PRIMARY KEY ("s_fk_price_list_id",
"d_effective_date"),
CONSTRAINT "fk_price_lists2_fk" FOREIGN KEY ("s_fk_price_list_id")
REFERENCES "price_list_base" ("s_price_list_id") ON DELETE NO ACTION ON
UPDATE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT "fk_price_lists_fk" FOREIGN KEY ("s_fk_price_list_include")
REFERENCES "price_list_base" ("s_price_list_id") ON DELETE NO ACTION ON
UPDATE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE
) WITH OIDS;

CREATE TABLE "price_list_items" (
"s_fk_item_id" char(8) NOT NULL,
"s_fk_price_list_id" char(3) NOT NULL,
"d_fk_effective_date" date NOT NULL,
"f_threshold_price" numeric(7, 2) NOT NULL,
"m_price" money,
CONSTRAINT "price_list_items_pkey" PRIMARY KEY ("s_fk_item_id",
"s_fk_price_list_id", "d_fk_effective_date", "f_threshold_price")
) WITH OIDS;

CODE THAT PRODUCES ERROR:
==========================
alter table price_list_items
ADD FOREIGN KEY (d_FK_Effective_Date, s_FK_Price_List_ID)
REFERENCES Price_Lists (d_Effective_Date, s_Price_List_ID);

EXACT ERROR:
============
UNIQUE constraint matching given keys for referenced table "price_lists" not
found


Thanks in advance,
Cheers,
Mathew
"Mathew Frank" <mathewfrank@qushi.com> writes:
> UNIQUE constraint matching given keys for referenced table "price_lists" not
> found

As of CVS tip your example gives

ERROR:  ALTER TABLE: column "s_price_list_id" referenced in foreign key constraint does not exist

which appears correct (you misspelled the column name).

7.2 does foreign key validity checking in a funny order that causes it
to produce the other error message first.  While not incorrect, it's
sure misleading :-(

            regards, tom lane

Re: spurious "UNIQUE constraint matching given keys for referenced table" error

From
"Mathew Frank"
Date:
> which appears correct (you misspelled the column name).
>
> 7.2 does foreign key validity checking in a funny order that causes it
> to produce the other error message first.  While not incorrect, it's
> sure misleading :-(

Thanks a bunch.

I'm always a bit nervous about calling anything a bug... 9/10 is caused by a
typo or something on behalf of the user ;)

Cheers,
Mathew
"Mathew Frank" <mathewfrank@qushi.com> writes:
> I'm always a bit nervous about calling anything a bug... 9/10 is caused by a
> typo or something on behalf of the user ;)

Well, it's a two-way street: typos and other sorts of mistakes tend to
stress paths that the developers would've never thought to test.
Besides, I'm a firm believer in the notion that software should deliver
useful error messages, and PG definitely wasn't getting that done in
this case.  So complain away.  I'm glad to be able to say "we already
fixed that for the next release", but that won't always be true...

            regards, tom lane