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: