Entendo que no PostgreSQL, se houver um FK de várias colunas de tabela B
para tabela A
e uma ou mais colunas FK na tabela B
forem anuláveis, o FK ainda será considerado "honrado" para as linhas em B
que o valor dessas colunas é de fato NULL sem verificação da presença de uma linha correspondente na tabela A
(já que as colunas de chave primária não podem ser anuladas):
No entanto, isso é específico do PostgreSQL ou está no padrão SQL? (experimentando o SQL Fiddle, parece que tanto o MS SQL Server quanto o MySQL se comportam da mesma maneira).
Esse comportamento (permitir
NULL
valores em colunas FK) está em conformidade com o padrão SQL. O manual:E não há exceção listada para restrições FK.
Para impedir que algumas colunas de um FK de várias colunas sejam NULL, use em vez do comportamento
MATCH FULL
padrão . O manual:MATCH SIMPLE
Ou apenas defina algumas ou todas as colunas
NOT NULL
. Mais aqui (como @ypercube comentou):