Uma restrição de chave estrangeira não se importa se a(s) coluna(s) referenciada(s) está(m) fazendo referência a outra coluna. Mas as colunas referenciadas devem seja único. Isso é o que a mensagem de erro lhe diz (muito claramente).
O que está faltando é uma chave estrangeira a restrição pode ser baseada em várias colunas . Isso deve funcionar:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Substituindo:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id) A forma abreviada da sintaxe (
REFERENCES submission ) é possível, porque você está referenciando a chave primária, que é o padrão. Além disso, você pode simplificar:faça
submission.num a chave primária da coluna sinlge, elimine as colunas redundantes user_id e assignment_id de correction e reduza a restrição fk para apenas (num) - conforme discutido em @Tim's answer
. Contanto que você tenha a restrição fk de várias colunas, considere
NOT NULL restrições em cada uma das colunas de referência (conforme comentado por @joop). Caso contrário, um ou mais valores NULL nas colunas de referência permitem escapar da restrição fk com o padrão MATCH SIMPLE comportamento. Isso pode ou não ser intencional, normalmente é não .Como alternativa, considere
MATCH FULL para restrições fk de várias colunas para permitir apenas se todos colunas de referência são NULL. Detalhes: