Restricciones FOREIGN KEY

Una clave externa (FK) es una columna o combinación de columnas que se utiliza para establecer y exigir un vínculo entre los datos de dos tablas. Puede crear una clave externa mediante la definición de una restricción FOREIGN KEY cuando cree o modifique una tabla.

En una referencia de clave externa, se crea un vínculo entre dos tablas cuando las columnas de una de ellas hacen referencia a las columnas de la otra que contienen el valor de clave principal. Esta columna se convierte en una clave externa para la segunda tabla.

Por ejemplo, la tabla Sales.SalesOrderHeader de la base de datos AdventureWorks2008R2 tiene un vínculo a la tabla Sales.SalesPerson porque existe una relación lógica entre pedidos de ventas y personal de ventas. La columna SalesPersonID de la tabla SalesOrderHeader coincide con la columna de clave principal de la tabla SalesPerson. La columna SalesPersonID de la tabla SalesOrderHeader es la clave externa para la tabla SalesPerson.

SalesOrderHeader.SalesPersonID es una clave externa

No es necesario que una restricción FOREIGN KEY esté vinculada únicamente a una restricción PRIMARY KEY de otra tabla; también puede definirse para que haga referencia a las columnas de una restricción UNIQUE de otra tabla. Una restricción FOREIGN KEY puede contener valores NULL, pero si alguna columna de una restricción FOREIGN KEY compuesta contiene valores NULL, se omitirá la comprobación de los valores que componen la restricción FOREIGN KEY. Para asegurarse de que todos los valores de la restricción FOREIGN KEY compuesta se comprueben, especifique NOT NULL en todas las columnas que participan.

Nota

Una restricción FOREIGN KEY puede hacer referencia a columnas de tablas de la misma base de datos o a columnas de una misma tabla. Se denominan tablas con referencia a sí mismas. Suponga, por ejemplo, una tabla de empleados con tres columnas: employee_number, employee_name y manager_employee_number. Dado que el responsable también es un empleado, hay una relación de clave externa desde la columna manager_employee_number a la columna employee_number.

Integridad referencial

Aunque el fin principal de una restricción FOREIGN KEY es controlar los datos que pueden almacenarse en la tabla de la clave externa; también controla los cambios realizados en los datos de la tabla de la clave principal. Por ejemplo, si se elimina la fila de un vendedor de la tabla Sales.SalesPerson y el identificador del vendedor se utiliza para pedidos de ventas en la tabla Sales.SalesOrderHeader, se rompe la integridad relacional entre ambas tablas: los pedidos del vendedor eliminado quedarán sin correspondencia en la tabla SalesOrderHeader sin ningún vínculo con los datos de la tabla SalesPerson.

Con una restricción FOREIGN KEY se evita esta situación. Esta restricción exige la integridad referencial al garantizar que no se puedan realizar cambios en los datos de la tabla de la clave principal si esos cambios anulan el vínculo con los datos de la tabla de la clave externa. Si se intenta eliminar la fila de una tabla de la clave principal o cambiar un valor de clave principal, la acción no progresará si el valor de la clave principal cambiado o eliminado corresponde a un valor de la restricción FOREIGN KEY de otra tabla. Para cambiar o eliminar una fila de una restricción FOREIGN KEY, debe antes eliminar o cambiar los datos de clave externa de la tabla de clave externa, lo que vincula la clave externa con otros datos de clave principal.

Indizar restricciones FOREIGN KEY

La creación de un índice en una clave externa suele ser útil por las siguientes razones:

  • Los cambios en las restricciones PRIMARY KEY se comprueban con restricciones FOREIGN KEY en las tablas relacionadas.

  • Las columnas de clave externa suelen utilizarse en los criterios de combinación cuando los datos de las tablas relacionadas se combinan en consultas mediante la correspondencia de la columna o columnas de la restricción FOREIGN KEY de una tabla y la columna o columnas de la clave única o principal de la otra. Un índice permite al Motor de base de datos buscar con rapidez datos relacionados en la tabla de clave externa.No obstante, no es necesario crear este índice. Pueden combinarse los datos de dos tablas relacionadas aunque no se hayan definido restricciones PRIMARY KEY o FOREIGN KEY entre ellas, pero una relación de clave externa entre dos tablas indica que éstas se han optimizado para su combinación en una consulta que utilice las claves como criterio. Para obtener más información acerca de cómo usar restricciones FOREIGN KEY con combinaciones, vea Aspectos básicos de las combinaciones y Tipos de consultas e índices.

Número de restricciones FOREIGN KEY en una tabla

SQL Server no establece un límite predefinido en el número de restricciones FOREIGN KEY que una tabla puede incluir (que hagan referencia a otras tablas) ni el número de restricciones FOREIGN KEY pertenecientes a otras tablas que hagan referencia a determinada tabla. No obstante, el número real de restricciones FOREIGN KEY se ve limitado por la configuración de hardware y el diseño de la base de datos y la aplicación. Se recomienda que una tabla no contenga más de 253 restricciones FOREIGN KEY y que no sea referencia para más de 253 restricciones FOREIGN KEY. Tenga en cuenta el costo de exigir restricciones FOREIGN KEY cuando diseñe la base de datos y las aplicaciones.