sql >> Database >  >> RDS >> Sqlserver

Hoe een externe sleutelbeperking op meerdere kolommen in SQL Server te maken - SQL Server / TSQL-zelfstudie, deel 67

Scenario:

U werkt als SQL Server-ontwikkelaar, u moet een tabel dbo.Customer maken met samengestelde primaire sleutel door kolommen FName en SSN te gebruiken. Als u klaar bent met het maken van een primaire sleutel in de dbo.Klanttabel, moet u een tweede tabel dbo.Orders maken en een externe sleutelbeperking maken door gebruik te maken van de primaire sleutelkolommen.

Oplossing:

Laten we de dbo.Customer-tabel met samengestelde primaire sleutel maken met behulp van onderstaand script.

GEBRUIK YourDatabaseNameGOCREATE 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 Primaire sleutel (FName,SSN) )




Merk op dat we Constraint Constraint_Name Primary Key(Column1, Column2) gebruiken, zoals groen gemarkeerd om een ​​samengestelde primaire sleutel te maken.
Laten we de dbo.Orders maken tabel met behulp van onderstaand script.

TABEL MAKEN dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR( 10) Niet null, beperking Fk_Order_Customer_FName_SSN BUITENLANDSE SLEUTEL (FirstName,SSN) REFERENTIES dbo.Customer(FName,SSN) )




Om een ​​Foreign Key Constraint met meerdere kolommen te maken, gebruikt u het script zoals groen gemarkeerd. U zult zeggen Constraint Constraint_Name Foreign Key(Column1,Column2) References dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
U kunt zien dat In dbo.Orders, ik kolommen FirstName heb in plaats van FName die ik heb in dbo.Customer tabel. Het betekent dat u niet dezelfde kolomnaam in beide tabellen hoeft te hebben wanneer u refererende sleutelreferentie maakt.

Laten we records in elke tabel invoegen en kijken of alles goed werkt met Foreign Key Constraint.
 INSERT INTO dbo.Customer (FName, LName,SSN) waarden ('Aamir','Shahzad','000-000-01') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,FirstName,SSN) waarden ('TV',1,'Aamir','000-000-01')
 
 Records zijn succesvol ingevoegd. Laten we verifiëren met behulp van Select query
Foreign Key-beperking maken op meerdere kolommen in SQL Server-tabel


Laten we proberen een waarde in te voegen in dbo.Orders die niet bestaat in dbo.Customer. Het zou via ons moeten zijn als een fout vanwege de beperking van de Foreign Key.
 INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,FirstName,SSN) waarden ('TV',1,'Aamir','000-000- 02')

Aangezien de gemarkeerde SSN-waarde niet bestaat in dbo.Customer, kregen we onderstaande foutmelding.
Msg 547, Level 16, State 0, Line 30De INSERT-instructie was in strijd met de FOREIGN KEY-beperking "Fk_Order_Customer_FName_SSN". Het conflict deed zich voor in de database "YourDatabaseName", tabel "dbo.Customer". De instructie is beëindigd.


*** De volgorde van de kolommen moet dezelfde zijn als in de primaire sleutel wanneer we een externe sleutelbeperking maken. Als ik een externe sleutelbeperking met een andere volgorde probeer te maken, krijg ik onderstaande foutmelding. VARCHAR(100), SSN VARCHAR(10) Not Null, Constraint Fk_Order_Customer_FName_SSN FOREIGN KEY (SSN,FirstName) REFERENTIES dbo.Customer(SSN,FName) )
 
 Msg 1776, Level 16, State 0, Line 13Er zijn geen primaire of kandidaat-sleutels in de tabel 'dbo.Customer' waarnaar wordt verwezen die overeenkomen met de lijst met verwijzende kolommen in de refererende sleutel 'Fk_Order_Customer_FName_SSN'.Msg 1750, Level 16, State 0, Line 13Kon geen beperking of index maken. Zie eerdere fouten.


Videodemo:beperking van externe sleutels maken voor meerdere kolommen in SQL Server







  1. Query Performance Insight:ontdekken wat resources van uw Azure SQL-database verbruikt?

  2. 4 functies om de maand van een datum in MariaDB te retourneren

  3. De bewerking is niet geldig voor de status van de transactiefout en het transactiebereik

  4. Back-ups maken van SQL-databases met de VDP Advanced SQL Agent