Search Postgresql Archives

Re: Referencing "less-unique" foreign keys

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Alban Hertroys wrote:
Hi all,

We migrated a database from version 7.3 something to 7.4.7 a while ago, and ever since that time we can't make new foreign keys to a particular table.

You shouldn't have been able to before.

> The problem is that the primary key on that table is on two
columns that are unique together, but that only one of them should be referenced from the other table.

Well there you go - a foreign-key must reference a set of rows with a unique constraint (i.e. a candidate-key).

Tables are as follows:

CREATE TABLE localization (
    localization_id        text    NOT NULL,
language_id integer NOT NULL REFERENCES language(language_id) MATCH FULL,
    content            text    NOT NULL
    PRIMARY KEY (localization_id, language_id)
);

CREATE TABLE description (
    description_id        serial    PRIMARY KEY,
content text NOT NULL REFERENCES localization(localization_id)
);

I'm not sure how we got the "content" column from "description" to reference "localization" back in version 7.3. Fact is, we can't seem to do this anymore since version 7.4:

I don't have 7.3.x to hand any more, but if you could create such a reference it was a bug. What you need to do is create a table to record which (unique) localization_id codes you have, so:

CREATE TABLE loc_ids (
  localization_id  text NOT NULL,
  PRIMARY KEY (localization_id)
);

CREATE TABLE localization (
  localization_id  text NOT NULL REFERENCES loc_ids,
  language_id      integer NOT NULL REFERENCES language,
  content          text NOT NULL,
  PRIMARY KEY (localization_id, language_id)
);

CREATE TABLE description (
  description_id  SERIAL,
  content         text NOT NULL REFERENCES loc_ids,
  PRIMARY KEY (description_id)
);

Of course, this seems to show that the "description" table isn't telling you anything you couldn't work out by adding a serial column to loc_ids. Perhaps you have more columns in it though.

You can setup triggers/views etc to automatically insert into loc_ids if you would like.

Does that help?
--
  Richard Huxton
  Archonet Ltd

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
      choose an index scan if your joining column's datatypes do not
      match

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux