Crear relaciones de claves externas
Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL Database Azure 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 SCHEMA 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 TABLE en la tabla.
Limitaciones
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ónFOREIGN 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, especifiqueNOT 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 más información, consulte CREATE TRIGGER (Transact-SQL).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 para 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 restriccionesFOREIGN KEY
que pertenecen a otras tablas y que hacen referencia a una tabla concreta. No obstante, el número real de restriccionesFOREIGN 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 conlleva las siguientes restricciones:Se admiten más de 253 referencias de clave externa para las operaciones
DELETE
yUPDATE
DML. No se admiten operacionesMERGE
.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 o tablas optimizadas para memoria.
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
Uso de SQL Server Management Studio
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 Creación y actualización de tablas de base de datos.
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...).
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_<tablename>_<tablename>
, 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.Seleccione la relación en la lista Relación seleccionada.
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.
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.
En la cuadrícula situada debajo del cuadro de diálogo, 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 .
Elija Aceptar para crear la relación.
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;