Crear relaciones de clave externa

Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed Instance

En este artículo se describe cómo crear relaciones de clave externa en SQL Server mediante SQL Server Management Studio o Transact-SQL. Cuando se asocian filas de una tabla con filas de otra tabla, se crea una relación entre las dos tablas.

Permisos

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.

La creación de una clave externa en una tabla existente requiere el permiso ALTER en la tabla.

Límites y restricciones

  • Una restricción de clave externa no tiene que estar vinculada solo a una restricción de clave principal en otra tabla. Las claves externas también se pueden definir para hacer referencia a las columnas de una restricción UNIQUE de otra tabla.

  • 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 la que se hace referencia. De lo contrario, se devuelve un mensaje de error de infracción de clave externa. 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.

  • Las restricciones FOREIGN KEY solo pueden hacer referencia a las tablas de la misma base de datos en el mismo servidor. La integridad referencial entre bases de datos debe implementarse a través de desencadenadores. Para obtener más información, vea CREATE TRIGGER.

  • Las restricciones FOREIGN KEY pueden hacer referencia a otra columna de la misma tabla, lo que se conoce como autorreferencia.

  • Una restricción FOREIGN KEY especificada en el nivel de columna solo puede incluir una columna de referencia. Esta columna debe tener el mismo tipo de datos que la columna en la que se define la restricción.

  • 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. 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.

  • El Motor de base de datos no tiene un límite predefinido en el número de restricciones FOREIGN KEY que puede contener una tabla y que hacen referencia a otras tablas. El Motor de base de datos tampoco limita el número de restricciones FOREIGN KEY que pertenecen a otras tablas y que hacen referencia a una tabla concreta. No obstante, el número real de restricciones FOREIGN KEY utilizadas está limitado por la configuración del hardware y por el diseño de la base de datos y de la aplicación. Una tabla puede hacer referencia a otras 253 tablas y columnas como claves externas (referencias de salida) como máximo. SQL Server 2016 (13.x) y versiones posteriores aumentan 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. (Requiere al menos el nivel de compatibilidad 130). El aumento tiene las siguientes restricciones:

    • Se admiten más de 253 referencias de clave externa para las operaciones DELETE y UPDATE DML. Las operaciones MERGE no se admiten.
    • Una tabla con una referencia de clave externa a sí misma seguirá limitada a 253 referencias de clave externa.
    • 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.

    Importante

    Stretch Database está en desuso en SQL Server 2022 (16.x). Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

  • Las restricciones FOREIGN KEY no se exigen en tablas temporales.

  • 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. Para obtener más información, vea Tipos definidos por el usuario de CLR.

  • 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) .

Crear una relación de clave externa en el Diseñador de tablas

Usar 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 seleccione Diseño.

    La tabla se abre en el Diseñador de tablas.

  2. En el menú Diseñador de tablas, seleccione Relaciones. (Consulte el menú Diseñador de tablas en el encabezado o haga clic con el botón derecho en el espacio vacío de la definición de tabla y, después, seleccione Relaciones... ).

  3. En el cuadro de diálogo Relaciones de clave externa, seleccione Agregar.

    La relación aparece en la lista Relación seleccionada con un nombre proporcionado por el sistema en el formato FK_<_nombredetabla>_<nombredetabla>, donde el primer nombre de tabla es el nombre de la tabla de claves externas y el segundo nombre de tabla es el nombre de la tabla de claves principales. Se trata simplemente de una convención de nomenclatura predeterminada y común para el campo (Nombre) del objeto de clave externa.

  4. Seleccione la relación en la lista Relación seleccionada.

  5. Seleccione Especificaciones de tablas y columnas en la cuadrícula situada a la derecha y, después, seleccione los puntos suspensivos ( ... ) situados a la derecha de la propiedad.

  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.

  7. En la cuadrícula situada debajo, elija las columnas que contribuyen a la clave principal de la tabla. En la celda de la cuadrícula adyacente situada a la derecha de cada columna, elija la columna de clave externa correspondiente de la tabla de clave externa.

    ElDiseñador de tablas sugerirá un nombre para la relación. Para cambiar este nombre, edite el contenido del cuadro de texto Nombre de la relación .

  8. Elija Aceptar para crear la relación.

  9. Cierre la ventana del diseñador de tablas y guarde los cambios para que el cambio de relación de clave externa surta efecto.

Crear una clave externa en una tabla nueva

Uso de 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 AdventureWorks. 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 .

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 existente

Uso de Transact-SQL

En el ejemplo siguiente se crea una clave externa en la columna TempID y se hace referencia a la columna SalesReasonID de la tabla Sales.SalesReason de la base de datos AdventureWorks.

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

Pasos siguientes