Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Restrição de chave estrangeira na tabela filho permite inserir valores que não existem na tabela pai


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 :