Discussion:
2mal "gleichen" FOREIGN KEY in einer Tabelle
(zu alt für eine Antwort)
markus
2005-10-09 11:01:52 UTC
Permalink
Hallo,

ich habe in einer Tabelle zwei columns, die als FOREIGN KEY auf den
"gleichen" Schlüssel zeigen.

CREATE TABLE series(
id SERIAL ,
PRIMARY KEY(id)
);
CREATE TABLE series_has_language(
series_id INTEGER NOT NULL ,
original_series_id INTEGER NOT NULL
);

ALTER TABLE series_has_language ADD FOREIGN KEY
series_id,original_series_id) REFERENCES series(id,id);

Dies gibt bei PostgreSQL 7.4 diesen Fehler:
FEHLER: in Tabelle »series«, auf die verwiesen wird, gibt es keinen
Unique Constraint, der auf die angegebenen Schlüssel passt

Schreibe ich es als einzelne Kommandos gibt es kein Problem
ALTER TABLE series_has_language ADD FOREIGN KEY (series_id) REFERENCES
series(id);
ALTER TABLE series_has_language ADD FOREIGN KEY (original_series_id)
REFERENCES series(id);

Handelt es sich dabei um eine Einschränkung von SQL oder PostgreSQL?
Oder versuche ich hier etwas, was irgendwelchen Design-Rules
wiederspricht und zu Problemen führen kann?

Vielen Dank für Eure Hilfe.

Bye

Markus

PS: Sollte es für dieses Problem schon hunderte von Antworten geben tut
es mir Leid. Ich konnte kein Antwort finden, kann aber daran liegen,
dass ich das Problem nicht vernünftig beschreiben kann :-(
Torsten Schneider
2005-10-09 18:18:27 UTC
Permalink
Post by markus
ALTER TABLE series_has_language ADD FOREIGN KEY
series_id,original_series_id) REFERENCES series(id,id);
Darf man mal fragen, welchen Sinn es haben soll, ein und den selben Key
doppelt in einer Tabelle zu referenzieren? Du forderst ja, dass die
Tupel (series_id,original_series_id) Entsprechungen in (id, id) haben.

Mach einfach zwei einzelne Rules daraus.

Oder beim create table gleich die Fremdschlüssel festlegen:

CREATE TABLE series_has_language(
series_id INTEGER NOT NULL references series(id),
original_series_id INTEGER NOT NULL references series(id)
);

Das "(id)" kann man auch weglassen, wenn man will, dann wird automatisch
der Primärschlüssel genommen, aber aus Gründen der Klarheit schreibe ich
das auch meist dazu.


Grüße, Torsten

Loading...