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: