Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So erstellen Sie eine Fremdschlüsseleinschränkung für mehrere Spalten in SQL Server - SQL Server / TSQL-Tutorial Teil 67

Szenario:

Sie arbeiten als SQL Server-Entwickler, Sie müssen eine Tabelle dbo.Customer mit zusammengesetztem Primärschlüssel erstellen, indem Sie die Spalten FName und SSN verwenden. Wenn Sie mit dem Erstellen des Primärschlüssels in der Tabelle dbo.Customer fertig sind, müssen Sie die zweite Tabelle dbo.Orders erstellen und mithilfe der Primärschlüsselspalten eine Fremdschlüsseleinschränkung erstellen.

Lösung:

Lassen Sie uns die Tabelle dbo.Customer mit dem zusammengesetzten Primärschlüssel erstellen, indem Sie das folgende Skript verwenden.

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




Beachten Sie, dass wir Constraint Constraint_Name Primärschlüssel (Spalte1, Spalte2) verwenden, wie grün hervorgehoben, um den zusammengesetzten Primärschlüssel zu erstellen.
Lassen Sie uns die dbo.Orders erstellen Tabelle mithilfe des folgenden Skripts.

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




Um eine Fremdschlüsseleinschränkung mit mehreren Spalten zu erstellen, verwenden Sie das grün hervorgehobene Skript. Sie sagen Constraint Constraint_Name Foreign Key(Column1,Column2) References dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Sie können sehen, dass ich in dbo.Orders die Spalten FirstName anstelle von FName habe, die ich in der dbo.Customer-Tabelle habe. Das bedeutet, dass Sie nicht denselben Spaltennamen in beiden Tabellen haben müssen, wenn Sie eine Fremdschlüsselreferenz erstellen.

Lassen Sie uns einen Datensatz in jede der Tabellen einfügen und sehen, ob alles mit dem Fremdschlüssel gut funktioniert Einschränkung.
     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')
 
 Datensätze wurden erfolgreich eingefügt. Lassen Sie uns dies überprüfen, indem Sie Abfrage auswählen
verwenden
Erstellen einer Fremdschlüsselbeschränkung für mehrere Spalten in einer SQL Server-Tabelle


Lassen Sie uns versuchen, einen Wert in dbo.Orders einzufügen, der in dbo.Customer nicht existiert. Es sollte als Fehler aufgrund einer Fremdschlüsseleinschränkung durchgehen.
    INSERT INTO dbo.Orders
    (OrderItemName,OrderItemAmt,FirstName,SSN)
    values ('TV',1,'Aamir','000-000-02')

Da der hervorgehobene SSN-Wert in dbo.Customer nicht existiert, haben wir den folgenden Fehler erhalten.
Msg 547, Ebene 16, Status 0, Zeile 30Die INSERT-Anweisung stand im Konflikt mit der FOREIGN KEY-Einschränkung "Fk_Order_Customer_FName_SSN". Der Konflikt ist in der Datenbank "YourDatabaseName", Tabelle "dbo.Customer" aufgetreten. Die Anweisung wurde beendet.


*** Die Reihenfolge der Spalten sollte dieselbe sein wie im Primärschlüssel, wenn wir eine Fremdschlüsselbeschränkung erstellen. Wenn ich versuche, eine Fremdschlüsseleinschränkung mit einer anderen Reihenfolge zu erstellen, erhalte ich die folgende Fehlermeldung.
    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)
    )
 
 Msg 1776, Level 16, State 0, Line 13There sind keine Primär- oder Kandidatenschlüssel in der referenzierten Tabelle „dbo.Customer“, die mit der referenzierenden Spaltenliste im Fremdschlüssel „Fk_Order_Customer_FName_SSN“ übereinstimmen.Msg 1750, Level 16, State 0, Line 13Einschränkung oder Index konnten nicht erstellt werden. Siehe vorherige Fehler.


Videodemo:So erstellen Sie eine Fremdschlüsseleinschränkung für mehrere Spalten in SQL Server