sql >> Databáze >  >> RDS >> Sqlserver

Jak vytvořit omezení cizího klíče na více sloupcích v SQL Server - SQL Server / Výukový program TSQL, část 67

Scénář:

Pracujete jako vývojář SQL Serveru, potřebujete vytvořit tabulku dbo.Customer se složeným primárním klíčem pomocí sloupců FName a SSN. Po vytvoření primárního klíče v tabulce dbo.Customer musíte vytvořit druhou tabulku dbo.Orders a vytvořit omezení cizího klíče pomocí sloupců Primary Key.

Řešení:

Vytvořme tabulku dbo.Customer se složeným primárním klíčem pomocí níže uvedeného skriptu.

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




Všimněte si, že jsme použili Constraint Constraint_Name Primary Key (Column1, Column2), jak je zvýrazněno zeleně, abychom vytvořili složený primární klíč.
Pojďme vytvořit dbo.Orders tabulku pomocí níže uvedeného skriptu.

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




K vytvoření omezení cizího klíče s více sloupci použijete skript zvýrazněný zeleně. Řeknete Constraint Constraint_Name Cizí klíč (Column1,Column2) Reference dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Vidíte, že v dbo.Orders mám sloupce FirstName místo FName, které mám v tabulce Cust.Cust. To znamená, že nemusíte mít stejný název sloupce v obou tabulkách, když vytváříte odkaz na cizí klíč.

Pojďme vložit záznamy do každé tabulky a uvidíme, zda vše funguje správně s cizím klíčem Omezení.
     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')
 
 Záznamy byly úspěšně vloženy. Pojďme to ověřit pomocí Select query
Jak vytvořit omezení cizího klíče ve více sloupcích v tabulce SQL Server


Zkusme vložit hodnotu do dbo.Orders, která v dbo.Customer neexistuje. Mělo by to přes nás jako chyba kvůli omezení cizího klíče.
    INSERT INTO dbo.Orders
    (OrderItemName,OrderItemAmt,FirstName,SSN)
    values ('TV',1,'Aamir','000-000-02')

Vzhledem k tomu, že zvýrazněná hodnota SSN v dbo.Customer neexistuje, došlo k chybě.
Zpráva 547, úroveň 16, stav 0, řádek 30Příkaz INSERT byl v konfliktu s omezením FOREIGN KEY "Fk_Order_Customer_FName_SSN". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Customer". Příkaz byl ukončen.


*** Pořadí sloupců by mělo být stejné, jaké máte v primárním klíči, když vytváříme omezení cizího klíče. Pokud se pokusím vytvořit omezení cizího klíče v jiném pořadí, zobrazí se chyba níže.
    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 13V odkazované tabulce 'dbo.Customer' nejsou žádné primární nebo kandidátské klíče, které by odpovídaly seznamu referenčních sloupců v cizím klíči 'Fk_Order_Customer_FName_SSN'.Msg 1750, Level 16, State 0, Line 13Nelze vytvořit omezení nebo index. Viz předchozí chyby.


Video ukázka:Jak vytvořit omezení cizího klíče na více sloupcích v SQL Server







  1. 5 výkonných funkcí Microsoft Access

  2. Jak používat šablony v SQL Server Management Studio (SSMS) - SQL Server / Výukový program TSQL, část 16

  3. Skalární funkce ODBC pro datum a čas na serveru SQL (příklady T-SQL)

  4. Architektura SQL Server AlwaysOn ( Availability Group ) a instalace krok za krokem -3 kroky ručního selhání