Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las claves principales y las claves externas son dos tipos de restricciones que se pueden usar para aplicar la integridad de datos en las tablas de SQL Server. Se trata de objetos de base de datos importantes.
En este tema se incluyen las siguientes secciones.
Restricciones de clave principal
Restricciones de clave externa
Restricciones de clave principal
Una tabla suele tener una columna o una combinación de columnas cuyos valores identifican de forma única cada fila de la tabla. Estas columnas se denominan claves principales de la tabla y exigen la integridad de entidad de la tabla. Dado que las restricciones de clave principal garantizan datos únicos, se definen con frecuencia en una columna de identidad.
Cuando especifica una restricción de clave principal en una tabla, el motor de base de datos exige la unicidad de los datos mediante la creación automática de un índice único para las columnas de clave principal. Este índice también permite un acceso rápido a los datos cuando se usa la clave principal en las consultas. Si se define una restricción de clave principal en más de una columna, los valores se pueden duplicar dentro de una columna, pero cada combinación de valores de todas las columnas de la definición de restricción de clave principal debe ser única.
Como se muestra en la ilustración siguiente, las columnas ProductID y VendorID de la tabla Purchasing.ProductVendor forman una restricción de clave principal compuesta para esta tabla. Esto garantiza que cada fila de la tabla ProductVendor tenga una combinación única de ProductID y VendorID. Esto impide la inserción de filas duplicadas.
Una tabla solo puede incluir una restricción de clave principal.
Una clave principal no puede superar las 16 columnas y una longitud total de clave de 900 bytes.
El índice generado por una restricción de clave principal no puede hacer que el número de índices de la tabla supere los 999 índices no clúster y 1 índice agrupado.
Si no se especifica si la constricción de la clave principal es de tipo agrupado o no agrupado, se utiliza el índice agrupado si no hay ningún índice de este tipo en la tabla.
Todas las columnas definidas en una restricción de clave principal se deben definir como no NULL. Si no se especifica la nulabilidad, todas las columnas que participan en una restricción de clave principal tienen su nulabilidad establecida en no null.
Si la clave principal se define en una columna de tipo definido por el usuario CLR, la implementación del tipo debe admitir el orden binario.
Restricciones de clave externa
Una clave externa (FK) es una columna o combinación de columnas que se usa para establecer y aplicar un vínculo entre los datos de dos tablas a fin de controlar los datos que se pueden almacenar una tabla de clave externa. 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 tiene un vínculo de clave externa a la tabla Sales.SalesPerson porque hay una relación lógica entre los pedidos de ventas y los vendedores. 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 de la tabla SalesPerson . Al crear esta relación de clave externa, no se puede insertar un valor para SalesPersonID en la tabla SalesOrderHeader si aún no existe en la tabla SalesPerson .
Índices en restricciones de clave externa
A diferencia de las restricciones de clave principal, la creación de una restricción de clave externa no crea automáticamente un índice correspondiente. No obstante, la creación manual de un índice en una clave externa suele ser útil por los siguientes motivos:
Las columnas de clave externa suelen usarse 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 de clave externa 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. Sin embargo, no es necesario crear este índice. Pueden combinarse los datos de dos tablas relacionadas aunque no se hayan definido restricciones de clave principal o de clave externa entre ellas, pero una relación de clave externa entre dos tablas indica que estas se han optimizado para su combinación en una consulta que use las claves como criterio.
Los cambios en las restricciones de clave principal se comprueban con restricciones de clave externa en las tablas relacionadas.
Integridad referencial
Aunque el fin principal de una restricción de clave externa 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 la fila de un representante de ventas se elimina de la tabla Sales.SalesPerson y el identificador del representante de ventas se usa para los pedidos de ventas en la tabla Sales.SalesOrderHeader, se interrumpe la integridad relacional entre las dos tablas; los pedidos de ventas del representante de ventas eliminado quedan huérfanos en la tabla SalesOrderHeader sin un vínculo a los datos de la tabla SalesPerson.
Con una restricción de clave externa se evita esta situación. La restricción aplica la integridad referencial garantizando que los cambios no se pueden realizar en los datos de la tabla de claves principal si esos cambios invalidan el vínculo a los datos de la tabla de claves externas. Si se intenta eliminar la fila de una tabla de claves principal o cambiar un valor de clave principal, se producirá un error en la acción cuando el valor de clave principal eliminado o cambiado se corresponda con un valor de la restricción de clave externa de otra tabla. Para cambiar o eliminar una fila de una restricción de clave externa, 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.
Integridad referencial en cascada
Las restricciones de integridad referencial en cascada permiten definir las acciones que el motor de base de datos lleva a cabo cuando un usuario intenta eliminar o actualizar una clave a la que apuntan las claves externas existentes. Se pueden definir las acciones en cascada.
NO ACTION El motor de base de datos genera un error y la acción eliminar o actualizar de la fila de la tabla primaria se revierte.
CASCADE Las filas correspondientes se actualizan o eliminan en la tabla de referencia cuando esa fila se actualiza o elimina en la tabla primaria. No se puede especificar CASCADE si una timestamp columna forma parte de la clave externa o de la clave a la que se hace referencia. ON DELETE CASCADE no se puede especificar para una tabla que tenga un desencadenador INSTEAD OF DELETE. ON UPDATE CASCADE no se puede especificar para las tablas que tienen desencadenadores INSTEAD OF UPDATE.
SET NULL Todos los valores que componen la clave externa se establecen en NULL cuando se actualiza o elimina la fila correspondiente de la tabla primaria. Para que esta restricción se ejecute, las columnas de clave externa deben aceptar valores NULL. No se puede especificar para las tablas que tienen desencadenadores INSTEAD OF UPDATE.
SET DEFAULT Todos los valores que componen la clave externa se establecen en sus valores predeterminados si la fila correspondiente de la tabla primaria se actualiza o elimina. Para que esta restricción se ejecute, todas las columnas de clave externa deben tener definiciones predeterminadas. Si una columna acepta valores NULL y no se ha establecido un valor predeterminado explícito, NULL se convierte en el valor predeterminado explícito de dicha columna. No se puede especificar para las tablas que tienen desencadenadores INSTEAD OF UPDATE.
CASCADE, SET NULL, SET DEFAULT y NO ACTION se pueden combinar en las tablas con relaciones referenciales entre sí. Si el Motor de base de datos detecta NO ACTION, detiene y revierte las acciones CASCADE, SET NULL y SET DEFAULT relacionadas. Cuando una instrucción DELETE hace que se combinen las acciones CASCADE, SET NULL, SET DEFAULT y NO ACTION, todas las acciones CASCADE, SET NULL y SET DEFAULT se aplican antes de que el Motor de base de datos compruebe la existencia de NO ACTION.
Desencadenadores y acciones referenciales en cascada
Las acciones referenciales en cascada activan los desencadenadores AFTER UPDATE o AFTER DELETE de la siguiente manera:
Todas las acciones referenciales en cascada causadas directamente por el DELETE original o UPDATE se realizan primero.
Si hay desencadenadores AFTER definidos en las tablas afectadas, estos desencadenadores se activan después de realizar todas las acciones en cascada. Estos desencadenadores se activan en el orden contrario a la acción en cascada. Si hay varios desencadenadores en una sola tabla, se activan en orden aleatorio, a menos que haya un desencadenador dedicado primero o último para la tabla. Este orden es como se especifica mediante sp_settriggerorder.
Si varias cadenas en cascada se originan en la tabla que era el destino directo de una acción UPDATE o DELETE, no se especifica el orden en que estas cadenas activan sus respectivos desencadenadores. Sin embargo, una cadena siempre activa todos sus desencadenadores antes que otra cadena inicie la activación.
Se desencadena un desencadenador AFTER en la tabla que es el destino directo de una acción UPDATE o DELETE, independientemente de si se ven afectadas las filas. En este caso, ninguna otra tabla se ve afectada por la cascada.
Si alguno de los desencadenadores anteriores realiza operaciones UPDATE o DELETE en otras tablas, estas acciones pueden iniciar cadenas en cascada secundarias. Estas cadenas secundarias se procesan para cada operación UPDATE o DELETE a la vez después de que todos los desencadenadores de todas las cadenas principales se activen. Este proceso puede repetirse recursivamente para las operaciones UPDATE o DELETE posteriores.
Ejecutar operaciones CREATE, ALTER, DELETE u otras del lenguaje de definición de datos (DDL) dentro de los desencadenadores puede provocar que se activen desencadenadores DDL. Esto puede realizar posteriormente operaciones DELETE o UPDATE que inicien cadenas y desencadenadores en cascada adicionales.
Si se genera un error dentro de una cadena de acciones referenciales en cascada determinada, se genera un error, no se desencadena ningún desencadenador AFTER en esa cadena y se revierte la operación DELETE o UPDATE que creó la cadena.
Una tabla que tiene un desencadenador INSTEAD OF tampoco puede tener una cláusula REFERENCES que especifique una acción en cascada. Sin embargo, un desencadenador AFTER en una tabla dirigida por una acción en cascada puede ejecutar una instrucción INSERT, UPDATE o DELETE en otra tabla o vista que activa un desencadenador INSTEAD OF definido en ese objeto.
Tareas relacionadas
En la tabla siguiente se enumeran las tareas comunes asociadas a las restricciones de clave principal y clave externa.
| Tarea | Tema |
|---|---|
| Describe cómo crear una clave principal. | Crear claves principales |
| Describe cómo eliminar una clave principal. | Eliminar claves principales |
| Describe cómo modificar una clave principal. | Modificar claves principales |
| Se describe cómo crear relaciones de clave externa | Crear relaciones de claves externas |
| Describe cómo modificar las relaciones de clave externa. | Modificar relaciones de claves externas |
| Describe cómo eliminar relaciones de clave externa. | Eliminar relaciones de claves externas |
| Describe cómo visualizar las propiedades de la clave externa. | Ver las propiedades de clave externa |
| Describe cómo deshabilitar restricciones de clave externa para la replicación. | Deshabilitar restricciones de clave externa para la replicación |
| Describe cómo deshabilitar restricciones de clave externa durante una instrucción INSERT o UPDATE. | Deshabilitar restricciones de clave externa con instrucciones INSERT y UPDATE |