Primeiro, temos o prático razões. As chaves estrangeiras são mantidas e verificadas usando índices. Para que um índice seja utilizável, precisamos conhecer os valores (procurados) de todas as colunas dentro do índice. Se tivermos um índice/pk em
(a,b)
e temos um valor de chave estrangeira de (NULL,1)
, não podemos procurar dentro do índice para determinar se existe alguma linha com um b
valor de 1. Isso tornaria a manutenção da chave estrangeira "cara". Mas, em segundo lugar, precisamos considerar a consistência. Para o caso de coluna única, é bastante incontroverso - se você tiver um valor na coluna FK, precisará haver um valor correspondente na coluna referenciada. Caso contrário, se a coluna FK for
NULL
então a restrição não é verificada. Mas, como estendemos isso para várias colunas? O que é a regra acima? Não há um único interpretação óbvia, mas sim múltiplas. A regra acima é "se todos colunas não são NULL, então a restrição é verificada" ou "se qualquer colunas não são NULL, então a restrição é verificada"? Essas regras são idênticas quando apenas uma única coluna está sendo considerada.
Você esperava que a regra fosse a segunda, quando na verdade é a primeira. Isso está explicitamente documentado :