A una restricción de clave externa no le importa si las columnas a las que se hace referencia hacen referencia a otra columna. Pero las columnas a las que se hace referencia deben ser único. Eso es lo que te dice el mensaje de error (bastante claro).
Lo que te falta es que una clave externa la restricción se puede basar en columnas múltiples . Esto debería funcionar:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Reemplazando:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
La forma abreviada de la sintaxis (REFERENCES submission
) es posible, porque está haciendo referencia a la clave principal, que es la predeterminada.
Además, puede simplificar:haga submission.num
la clave principal de una sola columna, suelte las columnas redundantes user_id
y assignment_id
de correction
y reduzca la restricción fk a solo (num)
- como se discutió en @Respuesta de Tim
.
Siempre que tenga la restricción fk multicolumna, considere NOT NULL
restricciones en cada una de las columnas de referencia (según lo comentado por @joop). De lo contrario, uno o más valores NULL en las columnas de referencia permiten escapar de la restricción fk con el valor predeterminado MATCH SIMPLE
comportamiento. Esto puede o no ser intencionado, por lo general no .
Alternativamente, considere MATCH FULL
para restricciones multicolumna fk para permitir solo eso si todo las columnas de referencia son NULL. Detalles: