sql >> Base de Datos >  >> RDS >> PostgreSQL

Claves externas que hacen referencia a otras claves externas en PostgreSQL

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: