PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Chaves estrangeiras referenciando outras chaves estrangeiras no PostgreSQL


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: