sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo crear una restricción de clave externa en varias columnas en SQL Server - Tutorial de SQL Server/TSQL, parte 67

Escenario:

Está trabajando como desarrollador de SQL Server, necesita crear una tabla dbo.Customer con clave primaria compuesta usando las columnas FName y SSN. Una vez que haya terminado de crear la clave principal en la tabla dbo.Customer, debe crear la segunda tabla dbo.Orders y crear una restricción de clave externa mediante el uso de columnas de clave principal.

Solución:

Vamos a crear la tabla dbo.Customer con clave principal compuesta usando el siguiente script.

USE YourDatabaseNameGOCREATE TABLE dbo.Customer ( Customerid INT Identity(1,1) ,FName VARCHAR(100) Not Null ,LName VARCHAR(100) ,SSN VARCHAR(10) No nulo, Restricción Pk_FName_SSN Clave principal (FName,SSN) )




Observe que usamos Restricción Restricción_Nombre Clave principal (Columna1, Columna2) como se resalta en verde para crear Clave principal compuesta.
Vamos a crear el dbo.Orders usando la siguiente secuencia de comandos.

CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR( 10) No es nulo, restricción Fk_Order_Customer_FName_SSN FOREIGN KEY (FirstName,SSN) REFERENCES dbo.Customer(FName,SSN) )




Para crear una restricción de clave foránea con varias columnas, utilizará un script resaltado en verde. Dirá Restricción Restricción_Nombre Clave externa (Columna1,Columna2) Referencias dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Puede ver que en dbo.Orders, tengo columnas FirstName en lugar de FName que tengo en la tabla dbo.Customer. Significa que no tiene que tener el mismo nombre de columna en ambas tablas cuando crea una referencia de clave externa.

Vamos a insertar un registro en cada una de las tablas y ver si todo funciona bien con Clave externa Restricción.
 INSERTAR EN dbo.Customer (FName, LName,SSN) valores ('Aamir','Shahzad','000-000-01') INSERTAR EN dbo.Orders (OrderItemName,OrderItemAmt,FirstName,SSN) valores ('TV',1,'Aamir','000-000-01')
 
 Los registros se insertan correctamente. Verifiquemos usando Select query
Cómo crear una restricción de clave externa en varias columnas en la tabla de SQL Server


Intentemos insertar un valor en dbo.Orders que no existe en dbo.Customer. Debería pasar por nosotros como un error debido a la restricción de la clave externa. 02')
Como el valor de SSN resaltado no existe en dbo.Customer, obtuvimos el siguiente error.
Mensaje 547, Nivel 16, Estado 0, Línea 30La instrucción INSERT entró en conflicto con la restricción FOREIGN KEY "Fk_Order_Customer_FName_SSN". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Customer". La declaración ha terminado.


*** El orden de las columnas debe ser el mismo que tiene en la clave principal cuando creamos una restricción de clave externa. Si trato de crear una restricción de clave externa con un orden diferente, obtendré el siguiente error.
 CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR(10) No nulo, restricción Fk_Order_Customer_FName_SSN CLAVE EXTERNA (SSN,FirstName) REFERENCIAS dbo.Customer(SSN,FName) )
 
 Msg 1776, Nivel 16, Estado 0, Línea 13 No hay claves primarias o candidatas en la tabla a la que se hace referencia 'dbo.Customer' que coincidan con la lista de columnas de referencia en la clave externa 'Fk_Order_Customer_FName_SSN'.Msg 1750, Nivel 16, Estado 0, Línea 13No se pudo crear la restricción o el índice. Ver errores anteriores.


Video de demostración:cómo crear una restricción de clave externa en varias columnas en SQL Server