sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan oprettes fremmednøglebegrænsning på flere kolonner i SQL Server - SQL Server / TSQL vejledning del 67

Scenarie:

Du arbejder som SQL Server-udvikler, du skal oprette en tabel dbo.Kunde med sammensat primærnøgle ved at bruge kolonnerne FName og SSN. En du er færdig med at oprette primær nøgle i dbo. Kundetabel, skal du oprette anden tabel dbo. Ordrer og oprette fremmednøglebegrænsning ved at bruge Primærnøglekolonner.

Løsning:

Lad os oprette dbo.Customer-tabellen med sammensat primærnøgle ved at bruge nedenstående script.

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




Bemærk, at vi har brugt Constraint Constraint_Name Primary Key(Column1, Column2) som fremhævet med grønt for at oprette sammensat primærnøgle.
Lad os oprette dbo.Orders tabel ved at bruge nedenstående script.

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




For at oprette en fremmednøglebegrænsning med flere kolonner, skal du bruge script som fremhævet med grønt. Du vil sige Constraint Constraint_Name Foreign Key(Column1,Column2) References dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Du kan se, at I dbo.Orders har jeg kolonner Fornavn i stedet for FName, som jeg har i dbo.Customer-tabellen. Det betyder, at du ikke behøver at have det samme kolonnenavn i begge tabeller, når du opretter en fremmednøglereference.

Lad os indsætte en post i hver af tabellerne og se, om alt fungerer fint med Foreign Key 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')
 
 Optegnelser er indsat. Lad os verificere ved at bruge Vælg forespørgsel
Sådan oprettes fremmednøglebegrænsning på flere kolonner i SQL Server-tabel


Lad os prøve at indsætte en værdi i dbo.Orders, som ikke findes i dbo.Customer. Det skal gennem os som fejl på grund af begrænsning af fremmed nøgle.
    INSERT INTO dbo.Orders
    (OrderItemName,OrderItemAmt,FirstName,SSN)
    values ('TV',1,'Aamir','000-000-02')

Da fremhævet SSN-værdi ikke eksisterer i dbo.Customer, fik vi under fejl.
Besked 547, niveau 16, tilstand 0, linje 30. INSERT-sætningen var i konflikt med FOREIGN KEY-begrænsningen "Fk_Order_Customer_FName_SSN". Konflikten opstod i databasen "YourDatabaseName", tabel "dbo.Customer". Udsagnet er blevet afsluttet.


*** Rækkefølgen af ​​kolonner skal være den samme, som du har i den primære nøgle, når vi opretter en begrænsning af en fremmednøgle. Hvis jeg forsøger at oprette en fremmednøglebegrænsning med en anden rækkefølge, får jeg fejlen 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)
    )
 
 Meddelelse 1776, niveau 16, tilstand 0, linje 13. Der er ingen primære eller kandidatnøgler i den refererede tabel 'dbo.Customer', der matcher referencekolonnelisten i fremmednøglen 'Fk_Order_Customer_FName_SSN'. Besked 1750, niveau 16, tilstand 0, 13 Kunne ikke oprette begrænsning eller indeks. Se tidligere fejl.


Videodemo:Sådan opretter du begrænsning af fremmednøgle på flere kolonner i SQL Server







  1. Returner 0, hvis feltet er null i MySQL

  2. SQL Server 2016:Opret en tabel

  3. Sådan opretter du forbindelse til en database ved hjælp af Workbench MySQL-klienten

  4. Annoncering af ClusterControl 1.5 - Med automatisk sikkerhedskopiering og cloud-upload