Crear relaciones de clave externaCreate Foreign Key Relationships

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

En este artículo se describe cómo crear relaciones de clave externa en SQL Server 2017SQL Server 2017 mediante SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This article describes how to create foreign key relationships in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. Cuando se asocian filas de una tabla con filas de otra tabla, se crea una relación entre las dos tablas.You create a relationship between two tables when you want to associate rows of one table with rows of another.

Antes de comenzarBefore You Begin! Límites y restriccionesLimits and Restrictions

  • No es necesario que una restricción de clave externa esté vinculada únicamente a una restricción de clave principal de otra tabla; también puede definirse para que haga referencia a las columnas de una restricción UNIQUE de otra tabla.A foreign key constraint does not have to be linked only to a primary key constraint in another table; it can also be defined to reference the columns of a UNIQUE constraint in another table.

  • Si se especifica un valor distinto de NULL en la columna de una restricción FOREIGN KEY, el valor debe existir en la columna a que se hace referencia; de lo contrario, se devolverá un error de infracción de clave externa.When a value other than NULL is entered into the column of a FOREIGN KEY constraint, the value must exist in the referenced column; otherwise, a foreign key violation error message is returned. Para asegurarse de que todos los valores de la restricción de clave externa compuesta se comprueben, especifique NOT NULL en todas las columnas que participan.To make sure that all values of a composite foreign key constraint are verified, specify NOT NULL on all the participating columns.

  • Las restricciones FOREIGN KEY solo pueden hacer referencia a las tablas de la misma base de datos en el mismo servidor.FOREIGN KEY constraints can reference only tables within the same database on the same server. La integridad referencial entre bases de datos debe implementarse a través de desencadenadores.Cross-database referential integrity must be implemented through triggers. Para obtener más información, vea CREATE TRIGGER.For more information, see CREATE TRIGGER.

  • Las restricciones FOREIGN KEY pueden hacer referencia a otras columnas de la misma tabla.FOREIGN KEY constraints can reference another column in the same table. Esto recibe el nombre de autorreferencia.This is referred to as a self-reference.

  • Una restricción FOREIGN KEY especificada en el nivel de columna solo puede incluir una columna de referencia.A FOREIGN KEY constraint specified at the column level can list only one reference column. Esta columna debe tener el mismo tipo de datos que la columna en la que se define la restricción.This column must have the same data type as the column on which the constraint is defined.

  • Una restricción FOREIGN KEY especificada en el nivel de tabla debe tener el mismo número de columnas de referencia que la lista de columnas de la restricción.A FOREIGN KEY constraint specified at the table level must have the same number of reference columns as the number of columns in the constraint column list. El tipo de datos de cada columna de referencia debe ser también el mismo que el de la columna correspondiente de la lista de columnas.The data type of each reference column must also be the same as the corresponding column in the column list.

  • El Motor de base de datosDatabase Engine no tiene un límite predefinido para el número de restricciones FOREIGN KEY que una tabla que hace referencia a otras tablas puede contener, o para el número de restricciones FOREIGN KEY pertenecientes a otras tablas que hacen referencia a una tabla específica.The Motor de base de datosDatabase Engine does not have a predefined limit on either the number of FOREIGN KEY constraints a table can contain that reference other tables, or the number of FOREIGN KEY constraints that are owned by other tables that reference a specific table. No obstante, el número real de restricciones FOREIGN KEY que se puede utilizar está limitado por la configuración del hardware y por el diseño de la base de datos y de la aplicación.Nevertheless, the actual number of FOREIGN KEY constraints that can be used is limited by the hardware configuration and by the design of the database and application. 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 tiene las siguientes restricciones:(Requires at least 130 compatibility level.) The increase has the following restrictions:

    • Se admiten más de 253 referencias de clave externa para las operaciones DELETE y UPDATE DML.Greater than 253 foreign key references are supported for DELETE and UPDATE DML operations. Las operaciones MERGE no se admiten.MERGE operations are not supported.
    • Una tabla con una referencia de clave externa a sí misma seguirá limitada a 253 referencias de clave externa.A table with a foreign key reference to itself is still limited to 253 foreign key references.
    • Actualmente, no hay disponibles más de 253 referencias de clave externa para índices de almacén de columnas, tablas optimizadas para memoria o Stretch Database.Greater than 253 foreign key references are not currently available for columnstore indexes, memory-optimized tables, or Stretch Database.
  • Las restricciones FOREIGN KEY no se exigen en tablas temporales.FOREIGN KEY constraints are not enforced on temporary tables.

  • Si la clave externa se define en una columna de tipo definido por el usuario CLR, la implementación del tipo debe admitir el orden binario.If a foreign key is defined on a CLR user-defined type column, the implementation of the type must support binary ordering. Para obtener más información, vea Tipos definidos por el usuario de CLR.For more information, see CLR User-Defined Types.

  • Una columna de tipo varchar(max) solo puede participar en una restricción FOREIGN KEY si la clave principal a la que hace referencia se define también como tipo varchar(max) .A column of type varchar(max) can participate in a FOREIGN KEY constraint only if the primary key it references is also defined as type varchar(max).

PermisosPermissions

La creación de una tabla nueva con una clave externa requiere el permiso CREATE TABLE en la base de datos y el permiso ALTER en el esquema en el que se crea la tabla.Creating a new table with a foreign key requires CREATE TABLE permission in the database and ALTER permission on the schema in which the table is being created.

La creación de una clave externa en una tabla existente requiere el permiso ALTER en la tabla.Creating a foreign key in an existing table requires ALTER permission on the table.

Crear una relación de clave externa en el Diseñador de tablasCreate a foreign key relationship in Table Designer

Usar SQL Server Management StudioUsing SQL Server Management Studio

  1. En el Explorador de objetos, haga clic con el botón derecho en la tabla que va a estar en el lado de la clave externa de la relación y, después, haga clic en Diseño.In Object Explorer, right-click the table that will be on the foreign-key side of the relationship and click Design.

    La tabla se abre en el Diseñador de tablas.The table opens in Table Designer.

  2. En el menú Diseñador de tablas , haga clic en Relaciones.From the Table Designer menu, click Relationships.

  3. En el cuadro de diálogo Relaciones de clave externa , haga clic en Agregar.In the Foreign-key Relationships dialog box, click Add.

    La relación aparece en la lista Relación seleccionada con un nombre proporcionado por el sistema con el formato FK_<tablename><tablename>, donde tablename es el nombre de la tabla de clave externa.The relationship appears in the Selected Relationship list with a system-provided name in the format FK<tablename>_<tablename>, where tablename is the name of the foreign key table.

  4. Haga clic en la relación en la lista Relación seleccionada .Click the relationship in the Selected Relationship list.

  5. Haga clic en Especificaciones de tablas y columnas en la cuadrícula situada a la derecha y, después, haga clic en los puntos suspensivos ( ... ) situados a la derecha de la propiedad.Click Tables and Columns Specification in the grid to the right and click the ellipses (...) to the right of the property.

  6. En el cuadro de diálogo Tablas y columnas , en la lista desplegable Clave principal , elija la tabla que estará en el lado de la clave principal de la relación.In the Tables and Columns dialog box, in the Primary Key drop-down list, choose the table that will be on the primary-key side of the relationship.

  7. En la cuadrícula situada debajo, elija las columnas que contribuyen a la clave principal de la tabla.In the grid beneath, choose the columns contributing to the table's primary key. En la celda de la cuadrícula adyacente situada a la izquierda de cada columna, elija la columna de clave externa correspondiente de la tabla de clave externa.In the adjacent grid cell to the left of each column, choose the corresponding foreign-key column of the foreign-key table.

    ElDiseñador de tablas sugerirá un nombre para la relación.Table Designer suggests a name for the relationship. Para cambiar este nombre, edite el contenido del cuadro de texto Nombre de la relación .To change this name, edit the contents of the Relationship Name text box.

  8. Elija Aceptar para crear la relación.Choose OK to create the relationship.

Crear una clave externa en una tabla nuevaCreate a foreign key in a new table

Usar Transact-SQLUsing Transact-SQL

En el ejemplo siguiente se crea una tabla y se define una restricción de clave externa en la columna TempID que hace referencia a la columna SalesReasonID de la tabla Sales.SalesReason en la base de datos de AdventureWorks.The following example creates a table and defines a foreign key constraint on the column TempID that references the column SalesReasonID in the Sales.SalesReason table in the AdventureWorks database. Las cláusulas ON DELETE CASCADE y ON UPDATE CASCADE se usan para garantizar que los cambios realizados en la tabla Sales.SalesReason se propaguen automáticamente a la tabla Sales.TempSalesReason .The ON DELETE CASCADE and ON UPDATE CASCADE clauses are used to ensure that changes made to Sales.SalesReason table are automatically propagated to the Sales.TempSalesReason table.

CREATE TABLE Sales.TempSalesReason 
   (
      TempID int NOT NULL, Name nvarchar(50)
      , CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID)
      , CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
        REFERENCES Sales.SalesReason (SalesReasonID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
   )
;

Crear una clave externa de una tabla existenteCreate a foreign key in an existing table

Usar Transact-SQLUsing Transact-SQL

En el ejemplo siguiente crea una clave externa en la columna TempID y hace referencia a la columna SalesReasonID de la tabla Sales.SalesReason de la base de datos de AdventureWorks.The following example creates a foreign key on the column TempID and references the column SalesReasonID in the Sales.SalesReason table in the AdventureWorks database.

ALTER TABLE Sales.TempSalesReason
   ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
      REFERENCES Sales.SalesReason (SalesReasonID)
      ON DELETE CASCADE
      ON UPDATE CASCADE
;

Para obtener más información, vea:For more information, see: