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

Come creare un vincolo di chiave esterna su più colonne in SQL Server - Tutorial SQL Server/TSQL Parte 67

Scenario:

Stai lavorando come sviluppatore SQL Server, devi creare una tabella dbo.Customer con chiave primaria composita utilizzando le colonne FName e SSN. Una volta completata la creazione della chiave primaria nella tabella dbo.Customer, è necessario creare la seconda tabella dbo.Orders e creare un vincolo di chiave esterna utilizzando le colonne della chiave primaria.

Soluzione:

Creiamo la tabella dbo.Customer con la chiave primaria composita utilizzando lo script seguente.

USE YourDatabaseNameGOCREATE TABLE dbo.Customer ( Customerid INT Identity(1,1) ,FName VARCHAR(100) Not Null ,LName VARCHAR(100) ,SSN VARCHAR(10) Non Null, Vincolo Pk_FName_SSN Chiave primaria (FName,SSN) )




Nota che abbiamo utilizzato Constraint Constraint_Name Primary Key(Column1, Column2) come evidenziato in verde per creare la chiave primaria composita.
Creiamo il dbo.Orders tabella utilizzando lo script seguente.

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




Per creare un vincolo di chiave esterna con più colonne, utilizzerai lo script evidenziato in verde. Dirai Constraint Constraint_Name Foreign Key(Column1,Column2) Riferimenti dbo.PrimaryKeyTable(PrimaryKeyColumn1,PrimaryKeyColumn2)
Puoi vedere che In dbo.Orders, ho colonne FirstName invece di FName che ho nella tabella dbo.Customer. Significa che non è necessario avere lo stesso nome di colonna in entrambe le tabelle quando si crea un riferimento alla chiave esterna.

Inseriamo un record in ciascuna tabella e vediamo se tutto funziona correttamente con la chiave esterna Vincolo.
 INSERT INTO valori dbo.Customer (FName, LName,SSN) ('Aamir','Shahzad','000-000-01') INSERT INTO valori dbo.Orders (OrderItemName, OrderItemAmt, FirstName, SSN) ('TV',1,'Aamir','000-000-01')
 
 I record sono stati inseriti correttamente. Verifichiamo utilizzando Seleziona query
Come creare un vincolo di chiave esterna su più colonne nella tabella di SQL Server


Proviamo a inserire in dbo.Orders un valore che non esiste in dbo.Customer. Dovrebbe essere un errore dovuto a un vincolo di chiave esterna.
 INSERT INTO valori dbo.Orders (OrderItemName, OrderItemAmt, FirstName, SSN) ('TV',1,'Aamir','000-000- 02')

Poiché il valore SSN evidenziato non esiste in dbo.Customer, abbiamo ricevuto un errore inferiore.
Msg 547, livello 16, stato 0, riga 30L'istruzione INSERT era in conflitto con il vincolo FOREIGN KEY "Fk_Order_Customer_FName_SSN". Il conflitto si è verificato nel database "YourDatabaseName", tabella "dbo.Customer". L'istruzione è stata terminata.


*** L'ordine delle colonne dovrebbe essere lo stesso che hai nella chiave primaria quando creiamo un vincolo di chiave esterna. Se provo a creare un vincolo di chiave esterna con un ordine diverso, visualizzerò l'errore inferiore. VARCHAR(100), SSN VARCHAR(10) Non Null, Vincolo Fk_Order_Customer_FName_SSN FOREIGN KEY (SSN,FirstName) RIFERIMENTI dbo.Customer(SSN,FName) )
 
 Msg 1776, livello 16, stato 0, riga 13Non ci sono chiavi primarie o candidate nella tabella di riferimento 'dbo.Customer' che corrispondono all'elenco delle colonne di riferimento nella chiave esterna 'Fk_Order_Customer_FName_SSN'.Msg 1750, livello 16, stato 0, riga 13 Impossibile creare vincolo o indice. Vedi gli errori precedenti.


Video demo:come creare vincoli di chiave esterna su più colonne in SQL Server