Scenario:
Du arbetar som SQL Server-utvecklare, du måste skapa en tabell dbo.Kund med sammansatt primärnyckel genom att använda kolumnerna FName och SSN. En du är klar med att skapa primärnyckel i dbo.Customer-tabell, måste du skapa andra tabell dbo.Orders och skapa främmande nyckel-begränsningar genom att använda primärnyckelkolumner.Lösning:
Låt oss skapa tabellen dbo.Customer med sammansatt primärnyckel genom att använda skriptet nedan.USE YourDatabaseName GO CREATE TABLE dbo.Customer ( Customerid INT Identity(1,1) ,FName VARCHAR(100) Not Null ,LName VARCHAR(100) ,SSN VARCHAR(10) Not Null, Constraint Pk_FName_SSN Primary Key (FName,SSN) )
Observera att vi använder Constraint Constraint_Name Primary Key(Column1, Column2) som markerad i grönt för att skapa en sammansatt primärnyckel.
Låt oss skapa dbo.Orders tabell genom att använda skriptet nedan.
CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR(10) Not Null, Constraint Fk_Order_Customer_FName_SSN FOREIGN KEY (FirstName,SSN) REFERENCES dbo.Customer(FName,SSN) )
För att skapa en utländsk nyckelbegränsning med flera kolumner kommer du att använda skriptet som är markerat i grönt. Du kommer att säga Constraint Constraint_Name Foreign Key(Column1,Column2) Referenser dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Du kan se att I dbo.Orders har jag kolumner FirstName istället för FName som jag har i dbo.Customer-tabellen. Det betyder att du inte behöver ha samma kolumnnamn i båda tabellerna när du skapar främmande nyckelreferens.
Låt oss infoga en post i varje tabell och se om allt fungerar bra med främmande nyckel Constraint.
INSERT INTO dbo.Customer (FName, LName,SSN) values ('Aamir','Shahzad','000-000-01') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,FirstName,SSN) values ('TV',1,'Aamir','000-000-01')
Posterna har infogats. Låt oss verifiera genom att använda Välj fråga
Hur man skapar utländska nyckelbegränsningar på flera kolumner i SQL Server-tabellen |
Låt oss försöka infoga ett värde i dbo.Orders som inte finns i dbo.Customer. Det bör genom oss som ett fel på grund av Foreign Key constraint.
INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,FirstName,SSN) values ('TV',1,'Aamir','000-000-02')
Eftersom det markerade SSN-värdet inte finns i dbo.Customer, fick vi under felet.
Msg 547, Level 16, State 0, Rad 30. INSERT-satsen kom i konflikt med FOREIGN KEY-begränsningen "Fk_Order_Customer_FName_SSN". Konflikten inträffade i databasen "YourDatabaseName", tabellen "dbo.Customer". Uttrycket har avslutats.
*** Kolumnernas ordningsföljd bör vara densamma som du har i primärnyckeln när vi skapar en begränsning av främmande nyckel. Om jag försöker skapa en främmande nyckel med en annan ordning får jag felet under.
CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR(10) Not Null, Constraint Fk_Order_Customer_FName_SSN FOREIGN KEY (SSN,FirstName) REFERENCES dbo.Customer(SSN,FName) )
Meddelande 1776, nivå 16, tillstånd 0, rad 13. Det finns inga primära eller kandidatnycklar i den refererade tabellen 'dbo.Customer' som matchar referenskolumnlistan i den främmande nyckeln 'Fk_Order_Customer_FName_SSN'. Medd. 1750, nivå 16, tillstånd 0, 13 Det gick inte att skapa begränsning eller index. Se tidigare fel.
Videodemo :Hur man skapar utländsk nyckelbegränsning på flera kolumner i SQL Server