Thread: re: 7.1.2 and foreign key unique constraint.

re: 7.1.2 and foreign key unique constraint.

From
patrick keshishian
Date:
Greetings,

I ran accross this problem upon upgrading our database from 7.0.3
to 7.1.2:

   ERROR:  UNIQUE constraint matching given keys for referenced
   table "some_table" not found


Looking through the mailing lists i came across a couple of
discussions regarding this very same error:

   http://fts.postgresql.org/db/mw/msg.html?mid=1022876
   http://fts.postgresql.org/db/mw/msg.html?mid=1024107


I have always used foreign keys for data integrity purposes.
Basically using them to make sure one table only contains values
that are "allowed" (read: are in the foriegn table field).


A simplified _example_ of my tables follows:


   --
   --
   -- Candidate stories for publishing.
   --
   create table news_stories
   (
      id       int4           not null,   -- not a primary key
      media    int2           not null,   -- 1 = text
                                          -- 2 = audio
                                          -- 3 = video
                                          -- etc ...
         --
         -- Note that there are NO primary/unique keys here.
         -- A story might have accompanying audio or video tracks
         -- that would share the same id.
         --
         -- e.g.,       id  , media type
         --    values ( 1000,    1     )  -- the story
         --    values ( 1000,    2     )  -- the audio interview
         --    values ( 1000,    3     )  -- mpeg footage
         --
         -- One can "almost" think of the primary key being a
         -- composite of (id,media).  But just for the sake of
         -- argument lets ignore this fact, if possible.

      author   varchar(64),
      -- some other fields go here
   );

   --
   --
   -- Assistant editors would review stories from news_stories
   -- and after approving them for publishing would enter them
   -- into the following table.
   --
   create table approved_stories
   (
      id       int4           not null
                              references news_stories(id),
      editor   varchar(64),
      -- some other fields go here
   );

   --
   --
   -- The chief editor would then select the stories to be
   -- published from the approved list of stories above.
   --
   create table published_stories
   (
      id       int4           not null
                              references approved_stories(id),
      -- some other fields ...
   );


I've been using the foreign key to have a constraint on the
values that would be "allowed" in the approved_stories.id field.
The id must be a value from a record already in news_stories.

The pre-condition for a published story would then be one that
is not only a "news story", but one that has been "approved" by
an assistant editor.



Apparently, I've been using the wrong "tool" to enforce the
pre-conditions in this case.


My question now becomes:  How can one enforce the pre-conditions
outlined above if the pre-condition for a foreign key is that it
has to be unique itself.


Thanks for your time,
--
patrick keshishian

Gnu  __   _
 -o)/ /  (_)__  __ ____  __
 /\\ /__/ / _ \/ // /\ \/ /
_\_v __/_/_//_/\_,_/ /_/\_\

Re: re: 7.1.2 and foreign key unique constraint.

From
Stephan Szabo
Date:
> I ran accross this problem upon upgrading our database from 7.0.3
> to 7.1.2:
>
>    ERROR:  UNIQUE constraint matching given keys for referenced
>    table "some_table" not found

Yeah, we fixed this to follow spec (sql actually requires that the
references be to a unique or primary key constraint)

For references to news_stories, you probably need to break news_stories
into two more normalized tables that actually have candidate keys.
I'd guess one would be id and fields that depend only on id and the other
would be id, media type and fields that depend on both of those.

I'm not so sure for the other constraint (still trying to think that case
through)


Re: re: 7.1.2 and foreign key unique constraint.

From
patrick keshishian
Date:
Hi Stephan,

Thanks for your reply and suggestions.  I was hoping for a
solution that would not require me to break apart any of the
tables or employ new ones.

But apparently i have no choice.

One would think that there would a such a construct defined in
SQL for specifying a field in a table with restriction placed on
its values based on values in a 'foreign table field'.

I'm sure i wouldn't be the only person that would utilize such a
feature.


Thanks again,




On Thu, Aug 02, 2001 at 03:20:24PM -0700, Stephan Szabo wrote:
>
> > I ran accross this problem upon upgrading our database from 7.0.3
> > to 7.1.2:
> >
> >    ERROR:  UNIQUE constraint matching given keys for referenced
> >    table "some_table" not found
>
> Yeah, we fixed this to follow spec (sql actually requires that the
> references be to a unique or primary key constraint)
>
> For references to news_stories, you probably need to break news_stories
> into two more normalized tables that actually have candidate keys.
> I'd guess one would be id and fields that depend only on id and the other
> would be id, media type and fields that depend on both of those.
>
> I'm not so sure for the other constraint (still trying to think that case
> through)

--
patrick keshishian

Gnu  __   _
 -o)/ /  (_)__  __ ____  __
 /\\ /__/ / _ \/ // /\ \/ /
_\_v __/_/_//_/\_,_/ /_/\_\

Re: re: 7.1.2 and foreign key unique constraint.

From
Stephan Szabo
Date:
On Fri, 3 Aug 2001, patrick keshishian wrote:

> Thanks for your reply and suggestions.  I was hoping for a
> solution that would not require me to break apart any of the
> tables or employ new ones.
>
> But apparently i have no choice.
>
> One would think that there would a such a construct defined in
> SQL for specifying a field in a table with restriction placed on
> its values based on values in a 'foreign table field'.

Technically, you would be able to handle this through a subquery
in a check constraint, however we don't support this currently
(it's a non-trivial problem to solve for a potentially complicated
query).