En främmande nyckel-begränsning bryr sig inte om den eller de refererade kolumnerna refererar till en annan kolumn i sig. Men de refererade kolumnerna måste vara unik. Det är vad felmeddelandet säger dig (ganska tydligt).
Det du saknar är att en främmande nyckel begränsning kan baseras på flera kolumner . Detta borde fungera:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Ersätter:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
Den korta formen av syntaxen (REFERENCES submission
) är möjligt eftersom du refererar till primärnyckeln, som är standard.
Dessutom kan du förenkla:skapa submission.num
den enkla kolumns primärnyckel, släpp de redundanta kolumnerna user_id
och assignment_id
från correction
och reducera fk-begränsningen till bara (num)
- som diskuterats i @Tims svar
.
Så länge du har begränsningen fk med flera kolumner, överväg NOT NULL
begränsningar för var och en av referenskolumnerna (som kommenterat av @joop). Annars tillåter ett eller flera NULL-värden i referenskolumnerna att undkomma fk-begränsningen med standardvärdet MATCH SIMPLE
beteende. Detta kan vara avsett eller inte, vanligtvis är det inte .
Tänk alternativt MATCH FULL
för flerkolumns fk-begränsningar att endast tillåta det om alla refererande kolumner är NULL. Detaljer: