Restricciones entre claves principales y claves externasPrimary and Foreign Key Constraints

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2016)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

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 ServerSQL Server .Primary keys and foreign keys are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. Se trata de objetos de base de datos importantes.These are important database objects.

Este tema contiene las siguientes secciones.This topic contains the following sections.

Restricciones de clave principalPrimary Key Constraints

Foreign Key ConstraintsForeign Key Constraints

Tareas relacionadasRelated Tasks

Restricciones de clave principalPrimary Key Constraints

Una tabla suele tener una columna o una combinación de columnas cuyos valores identifican de forma única cada fila de la tabla.A table typically has a column or combination of columns that contain values that uniquely identify each row in the table. Estas columnas se denominan claves principales de la tabla y exigen la integridad de entidad de la tabla.This column, or columns, is called the primary key (PK) of the table and enforces the entity integrity of the table. Debido a que las restricciones de clave principal garantizan datos únicos, con frecuencia se definen en una columna de identidad.Because primary key constraints guarantee unique data, they are frequently defined on an identity column.

Cuando especifica una restricción de clave principal en una tabla, Motor de base de datosDatabase Engine exige la unicidad de los datos mediante la creación automática de un índice único para las columnas de clave principal.When you specify a primary key constraint for a table, the Motor de base de datosDatabase Engine enforces data uniqueness by automatically creating a unique index for the primary key columns. Este índice también permite un acceso rápido a los datos cuando se usa la clave principal en las consultas.This index also permits fast access to data when the primary key is used in queries. Si se define una restricción de clave principal para más de una columna, puede haber valores duplicados dentro de la misma columna, pero cada combinación de valores de todas las columnas de la definición de la restricción de clave principal debe ser única.If a primary key constraint is defined on more than one column, values may be duplicated within one column, but each combination of values from all the columns in the primary key constraint definition must be unique.

Como se muestra en la siguiente ilustración, las columnas ProductID y VendorID de la tabla Purchasing.ProductVendor forman una restricción de clave principal compuesta para esta tabla.As shown in the following illustration, the ProductID and VendorID columns in the Purchasing.ProductVendor table form a composite primary key constraint for this table. De este modo, se garantiza que todas las filas de la tabla ProductVendor tengan una combinación de ProductID y VendorID.This makes sure that every row in the ProductVendor table has a unique combination of ProductID and VendorID. Esto impide la inserción de filas duplicadas.This prevents the insertion of duplicate rows.

Restricción PRIMARY KEY compuestaComposite PRIMARY KEY constraint

  • Una tabla solo puede incluir una restricción de clave principal.A table can contain only one primary key constraint.

  • Una clave principal no puede superar las 16 columnas y una longitud de clave total de 900 bytes.A primary key cannot exceed 16 columns and a total key length of 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 999 índices no clúster y 1 índice clúster.The index generated by a primary key constraint cannot cause the number of indexes on the table to exceed 999 nonclustered indexes and 1 clustered index.

  • Si no se especifica si es en clúster o no en clúster para una restricción de clave principal, se usa la disposición en clúster si no hay índices clúster en la tabla.If clustered or nonclustered is not specified for a primary key constraint, clustered is used if there no clustered index on the table.

  • Todas las columnas definidas en una restricción de clave principal se deben definir como no NULL.All columns defined within a primary key constraint must be defined as not null. Si no se especifica nulabilidad, la nulabilidad de todas las columnas que participan en una restricción de clave principal se establece en no NULL.If nullability is not specified, all columns participating in a primary key constraint have their nullability set to not 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.If a primary key is defined on a CLR user-defined type column, the implementation of the type must support binary ordering.

Foreign Key ConstraintsForeign Key Constraints

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.A foreign key (FK) is a column or combination of columns that is used to establish and enforce a link between the data in two tables to control the data that can be stored in the foreign key table. 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.In a foreign key reference, a link is created between two tables when the column or columns that hold the primary key value for one table are referenced by the column or columns in another table. Esta columna se convierte en una clave externa para la segunda tabla.This column becomes a foreign key in the second table.

Por ejemplo, la tabla Sales.SalesOrderHeader tiene un vínculo de clave externa a la tabla Sales.SalesPerson porque existe una relación lógica entre pedidos de ventas y personal de ventas.For example, the Sales.SalesOrderHeader table has a foreign key link to the Sales.SalesPerson table because there is a logical relationship between sales orders and salespeople. La columna SalesPersonID de la tabla SalesOrderHeader coincide con la columna de clave principal de la tabla SalesPerson .The SalesPersonID column in the SalesOrderHeader table matches the primary key column of the SalesPerson table. La columna SalesPersonID de la tabla SalesOrderHeader es la clave externa para la tabla SalesPerson .The SalesPersonID column in the SalesOrderHeader table is the foreign key to the SalesPerson table. Al crear esta relación de clave externa, no se puede insertar un valor para SalesPersonID en la tabla SalesOrderHeader si no existe en la tabla SalesPerson .By creating this foreign key relationship, a value for SalesPersonID cannot be inserted into the SalesOrderHeader table if it does not already exist in the SalesPerson table.

Una tabla puede hacer referencia a otras 253 tablas y columnas como claves externas (referencias de salida) como máximo.A table can reference a maximum of 253 other tables and columns as foreign keys (outgoing references). SQL Server 2016 (13.x)SQL Server 2016 (13.x) aumenta el límite para la cantidad de otras tablas y columnas que pueden hacer referencia a las columnas de una sola tabla (referencias de entrada) de 253 a 10 000. increases the limit for the number of other table and columns that can reference columns in a single table (incoming references), from 253 to 10,000. (Requiere al menos el nivel de compatibilidad 130). El aumento conlleva las siguientes restricciones:(Requires at least 130 compatibility level.) The increase has the following restrictions:

  • Mayor que 253 referencias de clave externa solo se admite para operaciones DELETE DML.Greater than 253 foreign key references are only supported for DELETE DML operations. No se admiten operaciones UPDATE y MERGE.UPDATE and MERGE operations are not supported.

  • Una tabla con una referencia de clave externa a sí misma sigue estando limitada a 253 referencias de clave externa.A table with a foreign key reference to itself is still limited to 253 foreign key references.

  • Mayor que 253 referencias de clave externa no está actualmente disponible para índices de almacén de columnas, tablas optimizadas para memoria, Stretch Database o tablas de clave externa particionadas.Greater than 253 foreign key references are not currently available for columnstore indexes, memory-optimized tables, Stretch Database, or partitioned foreign key tables.

Índices de restricciones de clave externaIndexes on Foreign Key Constraints

A diferencia de las restricciones de clave principal, la creación una restricción de clave externa no crea automáticamente el índice correspondiente.Unlike primary key constraints, creating a foreign key constraint does not automatically create a corresponding index. No obstante, la creación manual de un índice en una clave externa suele ser útil por los siguientes motivos:However, manually creating an index on a foreign key is often useful for the following reasons:

  • 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.Foreign key columns are frequently used in join criteria when the data from related tables is combined in queries by matching the column or columns in the foreign key constraint of one table with the primary or unique key column or columns in the other table. Un índice permite al Motor de base de datosDatabase Engine buscar con rapidez datos relacionados en la tabla de clave externa.An index enables the Motor de base de datosDatabase Engine to quickly find related data in the foreign key table. No obstante, no es necesario crear este índice.However, creating this index is not required. 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.Data from two related tables can be combined even if no primary key or foreign key constraints are defined between the tables, but a foreign key relationship between two tables indicates that the two tables have been optimized to be combined in a query that uses the keys as its criteria.

  • Los cambios en las restricciones de clave principal se comprueban con restricciones de clave externa en las tablas relacionadas.Changes to primary key constraints are checked with foreign key constraints in related tables.

Integridad referencialReferential Integrity

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.Although the main purpose of a foreign key constraint is to control the data that can be stored in the foreign key table, it also controls changes to data in the primary key table. Por ejemplo, si se elimina la fila de un vendedor de la tabla Sales.SalesPerson y el identificador del vendedor se usa 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 .For example, if the row for a salesperson is deleted from the Sales.SalesPerson table, and the salesperson's ID is used for sales orders in the Sales.SalesOrderHeader table, the relational integrity between the two tables is broken; the deleted salesperson's sales orders are orphaned in the SalesOrderHeader table without a link to the data in the SalesPerson table.

Con una restricción de clave externa se evita esta situación.A foreign key constraint prevents this situation. 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.The constraint enforces referential integrity by guaranteeing that changes cannot be made to data in the primary key table if those changes invalidate the link to data in the foreign key table. 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 de clave externa de otra tabla.If an attempt is made to delete the row in a primary key table or to change a primary key value, the action will fail when the deleted or changed primary key value corresponds to a value in the foreign key constraint of another table. 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.To successfully change or delete a row in a foreign key constraint, you must first either delete the foreign key data in the foreign key table or change the foreign key data in the foreign key table, which links the foreign key to different primary key data.

Integridad referencial en cascadaCascading Referential Integrity

Las restricciones de integridad referencial en cascada permiten definir las acciones que Motor de base de datosDatabase Engine lleva a cabo cuando un usuario intenta eliminar o actualizar una clave a la que apuntan las claves externas existentes.By using cascading referential integrity constraints, you can define the actions that the Motor de base de datosDatabase Engine takes when a user tries to delete or update a key to which existing foreign keys point. Se pueden definir las acciones en cascada.The following cascading actions can be defined.

NO ACTIONNO ACTION
Motor de base de datosDatabase Engine genera un error y se revierte la acción de eliminación o actualización de la fila de la tabla primaria.The Motor de base de datosDatabase Engine raises an error and the delete or update action on the row in the parent table is rolled back.

CASCADECASCADE
Si esa fila se actualiza o elimina en la tabla primaria, las filas correspondientes se actualizan o eliminan en la tabla de referencia.Corresponding rows are updated or deleted in the referencing table when that row is updated or deleted in the parent table. CASCADE no se puede especificar si una columna timestamp es parte de una clave externa o de la clave con referencia.CASCADE cannot be specified if a timestamp column is part of either the foreign key or the referenced key. ON DELETE CASCADE no se puede especificar en una tabla que tenga un desencadenador INSTEAD OF DELETE.ON DELETE CASCADE cannot be specified for a table that has an INSTEAD OF DELETE trigger. No se puede especificar ON UPDATE CASCADE para las tablas que tienen desencadenadores INSTEAD OF UPDATE.ON UPDATE CASCADE cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET NULLSET NULL
Cuando se actualiza o elimina la fila correspondiente en la tabla primaria, todos los valores que componen la clave externa se establecen en NULL.All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is updated or deleted. Para que esta restricción se ejecute, las columnas de clave externa deben aceptar valores NULL.For this constraint to execute, the foreign key columns must be nullable. No se puede especificar para las tablas que tienen desencadenadores INSTEAD OF UPDATE.Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET DEFAULTSET DEFAULT
Todos los valores que forman la clave externa se establecen en los valores predeterminados si se actualiza o elimina la fila correspondiente de la tabla primaria.All the values that make up the foreign key are set to their default values if the corresponding row in the parent table is updated or deleted. Para que esta restricción se ejecute, todas las columnas de clave externa deben tener definiciones predeterminadas.For this constraint to execute, all foreign key columns must have default definitions. 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.If a column is nullable, and there is no explicit default value set, NULL becomes the implicit default value of the column. No se puede especificar para las tablas que tienen desencadenadores INSTEAD OF UPDATE.Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

CASCADE, SET NULL, SET DEFAULT y NO ACTION se pueden combinar en las tablas con relaciones referenciales entre sí.CASCADE, SET NULL, SET DEFAULT and NO ACTION can be combined on tables that have referential relationships with each other. Si el Motor de base de datosDatabase Engine detecta NO ACTION, detiene y revierte las acciones CASCADE, SET NULL y SET DEFAULT relacionadas.If the Motor de base de datosDatabase Engine encounters NO ACTION, it stops and rolls back related CASCADE, SET NULL and SET DEFAULT actions. 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 datosDatabase Engine compruebe la existencia de NO ACTION.When a DELETE statement causes a combination of CASCADE, SET NULL, SET DEFAULT and NO ACTION actions, all the CASCADE, SET NULL and SET DEFAULT actions are applied before the Motor de base de datosDatabase Engine checks for any NO ACTION.

Desencadenadores y acciones referenciales en cascadaTriggers and Cascading Referential Actions

Las acciones referenciales en cascada activan los desencadenadores AFTER UPDATE o AFTER DELETE de la siguiente manera:Cascading referential actions fire the AFTER UPDATE or AFTER DELETE triggers in the following manner:

  • Primero se realizan todas las acciones referenciales en cascada generadas directamente por las instrucciones DELETE o UPDATE originales.All the cascading referential actions directly caused by the original DELETE or UPDATE are performed first.

  • Si se ha definido algún desencadenador AFTER en las tablas afectadas, estos desencadenadores se activan una vez realizadas todas las acciones en cascada.If there are any AFTER triggers defined on the affected tables, these triggers fire after all cascading actions are performed. Estos desencadenadores se activan en el orden contrario a la acción en cascada.These triggers fire in opposite order of the cascading action. Si hay varios desencadenadores en una sola tabla, se activan en un orden aleatorio a no ser que el primer o último desencadenador de la tabla sea un desencadenador dedicado.If there are multiple triggers on a single table, they fire in random order, unless there is a dedicated first or last trigger for the table. Este orden es como se especifica mediante sp_settriggerorder.This order is as specified by using sp_settriggerorder.

  • Si varias cadenas en cascada se originan desde la tabla que era el objetivo directo de una acción UPDATE o DELETE, el orden en que estas cadenas activan sus respectivos desencadenadores no está especificado.If multiple cascading chains originate from the table that was the direct target of an UPDATE or DELETE action, the order in which these chains fire their respective triggers is unspecified. Sin embargo, una cadena siempre activa todos sus desencadenadores antes que otra cadena inicie la activación.However, one chain always fires all its triggers before another chain starts firing.

  • Un desencadenador AFTER en la tabla que es el objetivo directo de una acción UPDATE o DELETE se activa independientemente de si afecta a alguna fila.An AFTER trigger on the table that is the direct target of an UPDATE or DELETE action fires regardless of whether any rows are affected. En este caso, ninguna otra tabla se ve afectada por la cascada.There are no other tables affected by cascading in this case.

  • Si alguno de los desencadenadores anteriores realiza operaciones UPDATE o DELETE en otras tablas, estas acciones pueden iniciar cadenas en cascada secundarias.If any one of the previous triggers perform UPDATE or DELETE operations on other tables, these actions can start secondary cascading chains. Estas cadenas secundarias se procesan a la vez para cada operación UPDATE o DELETE una vez activados todos los desencadenadores de todas las cadenas principales.These secondary chains are processed for each UPDATE or DELETE operation at a time after all triggers on all primary chains fire. Este proceso puede repetirse recursivamente para las operaciones UPDATE o DELETE posteriores.This process may be recursively repeated for subsequent UPDATE or DELETE operations.

  • Realizar CREATE, ALTER, DELETE u otras operaciones de lenguaje de definición de datos (DDL) dentro de los desencadenadores puede causar la activación de los desencadenadores DDL.Performing CREATE, ALTER, DELETE, or other data definition language (DDL) operations inside the triggers may cause DDL triggers to fire. Esto puede hacer que se lleven a cabo operaciones DELETE o UPDATE que inician cadenas y desencadenadores en cascada adicionales.This may subsequently perform DELETE or UPDATE operations that start additional cascading chains and triggers.

  • Si se genera un error en una cadena de acción referencial en cascada determinada, se produce un error, no se activa ningún desencadenador AFTER en esa cadena y la operación DELETE o UPDATE que ha creado la cadena se revierte.If an error is generated inside any particular cascading referential action chain, an error is raised, no AFTER triggers are fired in that chain, and the DELETE or UPDATE operation that created the chain is rolled back.

  • Una tabla con un desencadenador INSTEAD OF no puede tener también una cláusula REFERENCES que especifique un acción en cascada.A table that has an INSTEAD OF trigger cannot also have a REFERENCES clause that specifies a cascading action. Sin embargo, un desencadenador AFTER de la tabla de destino de una acción en cascada puede ejecutar una instrucción INSERT, UPDATE o DELETE en otra tabla o vista que active un desencadenador INSTEAD OF definido para dicho objeto.However, an AFTER trigger on a table targeted by a cascading action can execute an INSERT, UPDATE, or DELETE statement on another table or view that fires an INSTEAD OF trigger defined on that object.

Tareas relacionadasRelated Tasks

En la tabla siguiente se enumeran las tareas comunes asociadas a restricciones de clave principal y clave externa.The following table lists the common tasks associated with primary key and foreign key constraints.

TareaTask TemaTopic
Describe cómo crear una clave principal.Describes how to create a primary key. Crear claves principalesCreate Primary Keys
Describe cómo eliminar una clave principal.Describes how to delete a primary key. Eliminar claves principalesDelete Primary Keys
Describe cómo modificar una clave principal.Describes how to modify a primary key. Modificar claves principalesModify Primary Keys
Describe cómo crear relaciones de clave externaDescribes how to create foreign key relationships Crear relaciones de clave externaCreate Foreign Key Relationships
Describe cómo modificar las relaciones de clave externa.Describes how to modify foreign key relationships. Modificar relaciones de claves externas.Modify Foreign Key Relationships
Describe cómo eliminar relaciones de clave externa.Describes how to delete foreign key relationships. Eliminar relaciones entre claves externas.Delete Foreign Key Relationships
Describe cómo ver las propiedades de clave externa.Describes how to view foreign key properties. Ver las propiedades de clave externaView Foreign Key Properties
Describe cómo deshabilitar restricciones de clave externa para replicación.Describes how to disable foreign key constraints for replication. Deshabilitar una restricción FOREIGN KEY para la replicaciónDisable Foreign Key Constraints for Replication
Describe cómo deshabilitar las restricciones de clave externa durante una instrucción INSERT o UPDATE.Describes how to disable foreign key constraints during an INSERT or UPDATE statement. Deshabilitar restricciones FOREIGN KEY con instrucciones INSERT y UPDATEDisable Foreign Key Constraints with INSERT and UPDATE Statements