PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Fremdschlüssel, die auf andere Fremdschlüssel in PostgreSQL verweisen

Eine Fremdschlüsseleinschränkung kümmert sich nicht darum, ob die referenzierte(n) Spalte(n) selbst auf eine andere Spalte verweisen. Aber die referenzierte(n) Spalte(n) müssen einzigartig sein. Das sagt dir die Fehlermeldung (ziemlich deutlich).

Was Sie vermissen, ist ein Fremdschlüssel Einschränkung kann auf mehreren Spalten basieren . Das sollte funktionieren:

FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission

Ersetzen:

FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)

Die Kurzform der Syntax (REFERENCES submission ) ist möglich, da Sie auf den Primärschlüssel verweisen, was der Standardwert ist.

Außerdem können Sie es vereinfachen:Machen Sie submission.num den einspaltigen Primärschlüssel, lassen Sie die redundanten Spalten user_id weg und assignment_id von correction und reduzieren Sie die fk-Einschränkung auf nur (num) - wie in @Tims Antwort besprochen .

Solange Sie die Multicolumn-fk-Einschränkung haben, ziehen Sie NOT NULL in Betracht Einschränkungen für jede der referenzierenden Spalten (wie von @joop kommentiert). Andernfalls ermöglichen ein oder mehrere NULL-Werte in den referenzierenden Spalten, die fk-Einschränkung mit dem Standardwert MATCH SIMPLE zu umgehen Verhalten. Dies kann beabsichtigt sein oder nicht, normalerweise ist es nicht .
Erwägen Sie alternativ MATCH FULL für mehrspaltige fk-Einschränkungen, um nur das zuzulassen, wenn alle referenzierende Spalten sind NULL. Einzelheiten: