sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man skapar främmande nyckelbegränsningar på flera kolumner i SQL Server - SQL Server / TSQL självstudie del 67

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







  1. DateTime2 vs DateTime i SQL Server

  2. Vad är det maximala antalet kolumner i en PostgreSQL-valfråga

  3. Vad representerar en dubbel i sql-server?

  4. SET NULL:Ange en sträng som ska returneras när ett nollvärde förekommer i SQLcl / SQL*Plus