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: