Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment créer une contrainte de clé étrangère sur plusieurs colonnes dans SQL Server - Tutoriel SQL Server / TSQL Partie 67

Scénario :

Vous travaillez en tant que développeur SQL Server, vous devez créer une table dbo.Customer avec une clé primaire composite en utilisant les colonnes FName et SSN. Une fois que vous avez terminé de créer la clé primaire dans la table dbo.Customer, vous devez créer une deuxième table dbo.Orders et créer une contrainte de clé étrangère à l'aide des colonnes de clé primaire.

Solution :

Créons la table dbo.Customer avec la clé primaire composite en utilisant le script ci-dessous.

USE YourDatabaseNameGOCREATE TABLE dbo.Customer ( Customerid INT Identity(1,1) ,FName VARCHAR(100) Not Null ,LName VARCHAR(100) ,SSN VARCHAR(10) Non Null, Contrainte Pk_FName_SSN Clé primaire (FName,SSN) )




Notez que nous avons utilisé Constraint Constraint_Name Primary Key(Column1, Column2) comme surligné en vert pour créer la clé primaire composite.
Créons le dbo.Orders table en utilisant le script ci-dessous.

CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR( 10) Non Null, contrainte Fk_Order_Customer_FName_SSN FOREIGN KEY (FirstName,SSN) REFERENCES dbo.Customer(FName,SSN) )




Pour créer une contrainte de clé étrangère avec plusieurs colonnes, vous utiliserez un script surligné en vert. Vous direz Constraint Constraint_Name Foreign Key(Column1,Column2) References dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Vous pouvez voir que dans dbo.Orders, j'ai des colonnes FirstName au lieu de FName que j'ai dans la table dbo.Customer. Cela signifie que vous n'avez pas besoin d'avoir le même nom de colonne dans les deux tables lorsque vous créez une référence de clé étrangère.

Insérons un enregistrement dans chacune des tables et voyons si tout fonctionne bien avec la clé étrangère 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')
 
 Les enregistrements sont insérés avec succès. Vérifions en utilisant Select query
Comment créer une contrainte de clé étrangère sur plusieurs colonnes dans une table SQL Server


Essayons d'insérer une valeur dans dbo.Orders qui n'existe pas dans dbo.Customer. Cela devrait nous passer par une erreur due à la contrainte de clé étrangère. 02')

Comme la valeur SSN en surbrillance n'existe pas dans dbo.Customer, nous avons obtenu l'erreur ci-dessous.
Msg 547, Niveau 16, État 0, Ligne 30L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY "Fk_Order_Customer_FName_SSN". Le conflit s'est produit dans la base de données "YourDatabaseName", table "dbo.Customer". L'instruction a été terminée.


*** L'ordre des colonnes doit être le même que celui que vous avez dans la clé primaire lorsque nous créons une contrainte de clé étrangère. Si j'essaie de créer une contrainte de clé étrangère avec un ordre différent, j'obtiendrai l'erreur ci-dessous.
 CREATE TABLE dbo.Orders ( OrderId INT Identity(1, 1) ,OrderitemName VARCHAR(50) ,OrderItemAmt INT ,FirstName VARCHAR(100), SSN VARCHAR(10) Non nul, contrainte Fk_Order_Customer_FName_SSN FOREIGN KEY (SSN,FirstName) REFERENCES dbo.Customer(SSN,FName) )
 
 Msg 1776, Niveau 16, État 0, Ligne 13 Il n'y a pas de clés primaires ou candidates dans la table référencée « dbo.Customer » qui correspondent à la liste de colonnes de référence dans la clé étrangère « Fk_Order_Customer_FName_SSN ». Msg 1750, Niveau 16, État 0, Ligne 13Impossible de créer une contrainte ou un index. Voir les erreurs précédentes.


Démo vidéo :comment créer une contrainte de clé étrangère sur plusieurs colonnes dans SQL Server