sql >> Base de Datos >  >> RDS >> Sqlserver

La restricción de clave externa en la tabla secundaria permite insertar valores que no existen en la tabla principal

Primero, tenemos la práctica razones. Las claves foráneas se mantienen y verifican mediante índices. Para que un índice sea utilizable, necesitamos conocer los valores (buscados) de todas las columnas dentro del índice. Si tenemos un índice/pk en (a,b) y tenemos un valor de clave externa de (NULL,1) , no podemos buscar dentro del índice para determinar si hay alguna fila con una b valor de 1. Esto haría que la clave foránea fuera "costosa" de mantener.

Pero en segundo lugar, debemos tener en cuenta la coherencia. Para el caso de una sola columna, es bastante poco controvertido:si tiene un valor en la columna FK, entonces debe haber un valor coincidente en la columna a la que se hace referencia. De lo contrario, si la columna FK es NULL entonces la restricción no se comprueba.

Pero, ¿cómo extendemos esto a múltiples columnas? Qué es la regla de arriba? No hay un solo interpretación obvia, sino múltiples. ¿Es la regla anterior "si todos las columnas no son NULL, entonces se verifica la restricción" o "si cualquiera las columnas no son NULL, entonces se verifica la restricción"? Estas reglas son idénticas cuando solo se está considerando una sola columna.

Esperabas que la regla fuera la segunda, cuando en realidad es la primera. Esto está explícitamente documentado :