Een externe-sleutelbeperking maakt het niet uit of de kolom(men) waarnaar wordt verwezen zelf verwijst naar een andere kolom. Maar de kolom(men) waarnaar wordt verwezen moeten wees uniek. Dat is wat de foutmelding je vertelt (heel duidelijk).
Wat je mist is dat een buitenlandse sleutel beperking kan gebaseerd zijn op meerdere kolommen . Dit zou moeten werken:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Vervangen:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
De korte vorm van de syntaxis (REFERENCES submission
) is mogelijk, omdat u verwijst naar de primaire sleutel, de standaardsleutel.
Bovendien kun je het vereenvoudigen:maak submission.num
de primaire sleutel met één kolom, laat de overbodige kolommen user_id
. vallen en assignment_id
van correction
en verminder de fk-beperking tot slechts (num)
- zoals besproken in @Tim's antwoord
.
Zolang je de fk-beperking met meerdere kolommen hebt, overweeg dan NOT NULL
beperkingen op elk van de verwijzende kolommen (zoals becommentarieerd door @joop). Anders kunnen een of meer NULL-waarden in de verwijzende kolommen ontsnappen aan de fk-beperking met de standaard MATCH SIMPLE
gedrag. Dit kan al dan niet de bedoeling zijn, meestal is het niet .
Overweeg ook MATCH FULL
voor fk-beperkingen met meerdere kolommen om dat alleen toe te staan als alle verwijzende kolommen zijn NULL. Details: