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

Come creare una tabella con più chiavi esterne e non confondersi

Capire le relazioni tra tabelle

Il server SQL aggiunge chiavi esterne per implementare le relazioni tra le tabelle in un database relazionale. Una tabella può avere relazioni uno a uno, uno a molti o molti a molti con un'altra tabella, a seconda del tipo di dati che si desidera archiviare.

Una relazione uno-a-uno è semplice e usata raramente. Ogni record in una tabella particolare si riferisce esattamente a un record in un'altra tabella.

Ad esempio, puoi memorizzare il nome, l'ID e il sesso dell'utente in una tabella (Utente tabella) e i relativi indirizzi verranno memorizzati nelle diverse tabelle (Indirizzo tavolo). Ogni record nell'Utente la tabella corrisponderà a un record nell'Indirizzo tavolo. Al contrario, ogni indirizzo nell'Indirizzo la tabella apparterrà a un solo record in Utente tabella.

Le relazioni uno-a-molti e molti-a-molti sono molto più frequenti.

Considera uno scenario in cui memorizzi informazioni su dipendenti, reparti, compagnie assicurative dei dipendenti e indirizzi degli uffici di un'organizzazione.

Partiamo dal presupposto che un dipendente possa appartenere a un solo dipartimento e possa abbonarsi a una sola compagnia assicurativa. Tuttavia, i dipartimenti e le compagnie assicurative possono avere più dipendenti. Il Dipartimento e Dipendente le tabelle avrebbero una relazione uno-a-molti. Allo stesso modo, l'Assicurazione e tabelle dei dipendenti avrebbe una relazione uno a molti.

Inoltre, l'organizzazione può avere più uffici e un dipendente può lavorare in più di un ufficio. Inoltre, un ufficio può avere più dipendenti. In questo caso, l'Ufficio e Dipendente le tabelle avrebbero una relazione molti-a-molti.

Per implementare la relazione molti-a-molti, è necessario creare una tabella di ricerca che colleghi due tabelle in una relazione molti-a-molti. Le tabelle originali contengono una relazione uno-a-molti con la tabella di ricerca.

Consideriamo la creazione di una relazione molti-a-molti tra il Dipendente e Ufficio tavoli. Dovresti creare una nuova tabella di ricerca Employee_Office . Quindi crei una relazione uno-a-molti tra il Dipendente e Ufficio_impiegato tabelle e l'Ufficio e Ufficio_impiegato tabelle.

Vediamo ora come si inseriscono le chiavi esterne in questa discussione.

Cosa sono le chiavi esterne e perché sono necessarie più chiavi esterne?

Nei database relazionali, le chiavi esterne implementano diversi tipi di relazioni tra database.

Ad esempio, per implementare una relazione uno-a-molti in SQL Server, è necessario aggiungere una chiave esterna in una tabella che si trova in molti lati della relazione uno-a-molti.

La chiave esterna fa riferimento alla chiave primaria o alla chiave di identità univoca della tabella che si trova su uno lato del tavolo. Quindi, in una relazione uno-a-molti tra il Dipartimento e Dipendente tabelle di cui abbiamo discusso sopra, il Dipendente table memorizzerà una chiave esterna che fa riferimento alla chiave primaria del Reparto tabella.

Negli scenari in cui una tabella può avere relazioni con più altre tabelle, sarà necessario aggiungere più chiavi esterne a una tabella. Per il Dipendente tabella, è necessario aggiungere chiavi esterne che facciano riferimento alle chiavi primarie del Dipartimento tabella e l'Assicurazione tavolo. Allo stesso modo, l'Ufficio_impiegato la tabella di ricerca avrà due chiavi esterne che fanno riferimento alle chiavi primarie del Dipendente e Ufficio tabelle.

Aggiunta di più chiavi esterne con SQL Server

Il diagramma seguente mostra lo schema del database che implementerai per il nostro semplice esempio:

Qui puoi vedere che il database ha cinque tabelle:Impiegato , Assicurazione , Dipartimento , Ufficio e Ufficio_impiegato .

Il Dipartimento e Dipendente le tabelle hanno una relazione uno a molti. Allo stesso modo, l'Assicurazione e Dipendente anche le tabelle hanno una relazione uno-a-molti. L'Ufficio e le tabelle Employee hanno una relazione molti-a-molti implementata utilizzando due relazioni uno-a-molti con Employee_Office tabella di ricerca.

Il Dipendente la tabella ha due chiavi esterne, Dep_Id e Insur_Id che fanno riferimento alle chiavi primarie (Id) del Reparto e Assicurazione rispettivamente tabelle.

Eseguiamo ora lo script SQL che crea il database descritto.

Inizia creando tabelle senza chiavi esterne. Se provi a creare tabelle con chiavi esterne che fanno riferimento ad altre tabelle non ancora create, riceverai un errore.

Nel nostro schema di database, il Dipartimento , Organizzazione e Ufficio le tabelle non hanno chiavi esterne. Lo script seguente crea un database fittizio denominato Organizzazione e vi aggiunge tre tabelle:Dipartimento , Assicurazione e Ufficio .

CREATE DATABASE Organization

USE Organization
CREATE TABLE Department
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

USE Organization
CREATE TABLE Insurance
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

USE Organization
CREATE TABLE Office
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

Puoi utilizzare i RIFERIMENTI CHIAVE STRANIERA vincolo per implementare una relazione di chiave esterna in SQL Server. Specificare il nome della tabella. Quindi specificare tra parentesi il nome della colonna per la chiave esterna a cui fare riferimento.

Lo script seguente crea il Dipendente tabella con chiavi esterne Dep_Id e Insur_Id che fanno riferimento alle colonne ID nel Reparto e Assicurazione rispettivamente tabelle.

USE Organization
CREATE TABLE Employee
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR (50) NOT NULL,
Age INT,
Gender VARCHAR (50),
Dep_Id int FOREIGN KEY REFERENCES Department(Id),
Insur_Id int FOREIGN KEY REFERENCES Insurance(Id)
)

Infine, lo script seguente crea Employee_Office tabella con due chiavi esterne Emp_Id e Office_Id .

USE Organization
CREATE TABLE Employee_Office
(
Id INT PRIMARY KEY IDENTITY(1,1),
Emp_Id int FOREIGN KEY REFERENCES Employee(Id),
Office_Id int FOREIGN KEY REFERENCES Office(Id)
)

Inserimento di record in tabelle con più chiavi esterne

Per inserire record in tabelle con più chiavi esterne, devi prima creare i record corrispondenti nelle tabelle a cui fanno riferimento le chiavi esterne nelle tabelle originali.

In pratica, per inserire record nel Dipendente tabella, dobbiamo prima creare i record corrispondenti nel Dipartimento e Assicurazione tavoli. È perché il Dipendente la tabella contiene chiavi esterne che fanno riferimento al Dipartimento e Assicurazione tabelle.

Per prima cosa, proviamo ad aggiungere record nel Dipendente tabella senza specificare le chiavi esterne che fanno riferimento al Dipartimento e Dipendente tabelle.

INSERT INTO Employee
VALUES ('James', 10, 'Male'),
('Sara', 7, 'Female')

Vedrai il seguente errore. Si verifica perché il numero di valori specificato non corrisponde al numero di colonne in Dipendente tabella.

Proviamo ad aggiungere alcuni valori fittizi per Dep_Id eInsur_Id colonne (chiavi straniere):

INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Vedrai il seguente errore poiché le tabelle Dipartimento e Assicurazione non hanno record con ID 2 e 1, rispettivamente.

Ora inseriamo i record nel Dipartimento , Assicurazione e Ufficio tabelle:

INSERT INTO Department
VALUES (1, 'Finance'),
(2, 'HR')

INSERT INTO Insurance
VALUES (1, 'Company A'),
(2, 'Company B')

INSERT INTO Office
VALUES (1, 'Paris'),
(2, 'London')

Dal Dipartimento e Assicurazione le tabelle ora hanno record con ID 2 e 1, puoi inserire record nel Dipendente tabelle con i valori di chiave esterna corrispondenti come mostrato di seguito:

INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Inserisci alcuni record in Employee_Office tavolo. Ma prima, vediamo i valori della colonna Id nella tabella Dipendente:

SELECT * FROM Employee

Il Dipendente contiene record con valori ID di 2 e 3. Puoi inserire record in Employee_Office tabella dove Emp_Id la colonna contiene 2 o 3 e Office_Id la colonna contiene 1 o 2.

INSERT INTO Employee_Office
VALUES (2, 1),
(2, 2),
(3,2)

Selezione di record da tabelle con chiavi esterne multiple

Per selezionare record da tabelle con chiavi esterne multiple, hai bisogno di JOIN.

Lo script seguente restituisce i valori del Nome e Sesso colonne del Dipendente tabella e il Nome colonne del Dipartimento e tabelle di assicurazione. Dal Dipendente tabella contiene due chiavi esterne, devi usare due LEFT JOIN dichiarazioni:

SELECT 
Employee.Name AS Employee_Name, 
Employee.Gender, 
Department.Name as Department_Name, 
Insurance.Name as Insurance

FROM Employee
LEFT JOIN Department ON Employee.Dep_Id  =  Department.Id
LEFT JOIN Insurance  ON Employee.Insur_Id = Insurance.Id

Allo stesso modo, puoi selezionare i valori del Nome e Sesso colonne del Dipendente tabella e il Nome colonna dall'Ufficio tabella utilizzando due istruzioni LEFT JOIN nella tabella di ricerca Employee_Office .

SELECT 
Employee.Name AS Employee_Name, 
Employee.Gender, 
Office.Name as Office_Name

FROM Employee
LEFT JOIN Employee_Office ON Employee.Id  =  Employee_Office.Emp_Id
LEFT JOIN Office  ON Office.Id = Employee_Office.Office_Id

ELIMINAZIONE di record da tabelle con chiavi esterne multiple

Puoi eliminare record da tabelle con più chiavi esterne. Tuttavia, assicurati che la tabella non sia referenziata da una chiave esterna in un'altra colonna.

Ad esempio, non dovresti eliminare i record dal Dipartimento tabella a cui fa riferimento Emp_Id chiave esterna nel Dipendente tavolo. Ecco un esempio:

DELETE FROM Department WHERE Id = 1

Dal record con Id 1 nel Dipartimento la tabella è referenziata da Emp_Id nella colonna Dipendente tabella, non è possibile eliminarla come indicato nell'errore precedente. Innanzitutto, devi eliminare tutti i record dal Dipendente tabella dove Emp_Id è 1.

La tabella Impiegato contiene solo 1 record di questo tipo (con il valore Id di 3). Proviamo a cancellare quel record con la seguente query:

DELETE FROM Employee WHERE Id = 3

Vedrai l'errore che si verifica perché Employee_Office contiene un record in cui Emp_Id la colonna della chiave esterna contiene 3 record. Quindi dovrai prima rimuovere quel record:

Lo script seguente rimuove il record con Emp_Id valore di 3 dall'Ufficio_impiegato tabella.

DELETE FROM Employee_Office WHERE Emp_Id = 3

Infine, lo script seguente rimuove il record con valori Id pari a 1 dal Impiegato e Dipartimento colonne.

DELETE FROM Employee WHERE Id = 1
DELETE FROM Department WHERE Id = 1

Conclusione

Pertanto, abbiamo esaminato l'aggiunta di più chiavi esterne nelle tabelle di SQL Server utilizzando le query SQL per aggiungere chiavi esterne. Spero che questi esempi pratici utilizzati nell'articolo ti abbiano aiutato a padroneggiare questo argomento.

Quando si tratta di chiavi esterne e dipendenze delle tabelle per eseguire le attività di lavoro, è anche utile utilizzare gli strumenti software per semplificare le routine. Altamente raccomandato è il Visual Database Diagram come soluzione dedicata per visualizzare tutte le dipendenze tra le tabelle. Inoltre, puoi generare una documentazione precisa per l'intero database, indipendentemente dalla sua complessità, con la funzione Database Documenter.

Entrambi questi strumenti mirano a ridurre il carico manuale, automatizzare i processi e accelerare le prestazioni per alleggerire il carico.