Scopri come creare una relazione tra due tabelle in SQL Server.
Nella progettazione di database relazionali, una relazione è dove due o più tabelle sono collegate tra loro perché contengono dati correlati. Ciò consente agli utenti di eseguire query per dati correlati su più tabelle.
Questa parte del tutorial spiega come creare le seguenti relazioni:
Ci sono due relazioni in quel diagramma. C'è una relazione tra gli Albums
e Artists
tabelle, e c'è un'altra relazione tra gli Albums
e Genres
tabelle.
Osservando quel diagramma, possiamo vedere che un artista potrebbe avere molti album. In questo caso, abbiamo solo bisogno di avere una riga che contenga il nome dell'artista, indipendentemente dal numero di album che ha. Questo perché possiamo creare un record in Artists
tabella con un ArtistId
univoco . Tutti gli album di quell'artista risiederanno negli Albums
tabella e conterranno lo stesso ID artista nel proprio ArtistId
colonna. In questo modo, possiamo eseguire una query su entrambe le tabelle e restituire il nome dell'artista, oltre a tutti gli album che hanno pubblicato. Questo è il vantaggio delle relazioni.
In precedenza abbiamo creato un database contenente le tre tabelle precedenti. Quando lo abbiamo fatto, abbiamo anche creato una delle relazioni illustrate nel diagramma sopra. Abbiamo creato la relazione tra gli Albums
tabella e gli Artists
tabella (dove ArtistId
colonna degli Albums
la tabella fa riferimento a ArtistsId
colonna degli Artists
tabella).
Ecco il codice che abbiamo eseguito per creare le tabelle:
Il codice evidenziato è la parte che crea una relazione tra gli Albums
tabella e gli Artists
tavolo. Lo fa impostando ArtistId
colonna degli Albums
per fare riferimento a ArtistId
colonna degli Artists
tabella.
Un modo più tecnico per dirlo è che Albums.ArtistId
diventa una chiave esterna di Artists.ArtistId
(che di per sé è la chiave primaria di quella tabella). Questo è un vincolo di chiave esterna.
Cos'è un vincolo di chiave esterna?
Un vincolo di chiave esterna definisce una relazione tra questa tabella e un'altra tabella. Quando crei un vincolo di chiave esterna, lo crei su una colonna specifica nel figlio tabella, per fare riferimento a una colonna specifica in parent tabella.
Ciò rende quella colonna nella tabella figlio una chiave esterna . Il vincolo garantisce che qualsiasi valore che entra in questa colonna (chiave esterna) corrisponda a un valore nella colonna della chiave primaria della tabella padre. Se qualcuno tenta di immettere un valore che non corrisponde a un valore nella colonna della chiave primaria della tabella padre, SQL Server genererà un errore.
Questo aiuta a rafforzare l'integrità referenziale. Ci impedisce di avere record orfani (record figlio che non hanno un genitore). O nel nostro esempio, album che non sono associati ad alcun artista.
Se utilizzi uno strumento di gestione del database GUI come SSMS o Azure Data Studio, la relazione verrà visualizzata sotto le Keys
nodo per la tabella con la chiave esterna:
Decostruiamo il codice:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
Le prime due righe creano la relazione. Creano un vincolo di chiave esterna tra
Albums.ArtistId
e la colonna
Artists.ArtistId
colonna. In questo caso chiamiamo il vincolo di chiave esterna FK_Albums_Artists
.
Le ultime due righe specificano cosa deve fare SQL Server se qualcuno tenta di eliminare o aggiornare un record padre a cui fa riferimento un record nella tabella figlio. In questo caso, NO ACTION
significa che l'eliminazione/l'aggiornamento non andrà avanti. L'utente riceverà semplicemente un errore.
Puoi cambiarlo in ON DELETE CASCADE
se vuoi essere in grado di eliminare il genitore e il figlio in una volta sola (ad es. l'eliminazione verrà eseguita a cascata dal genitore al figlio). La stessa logica vale per gli aggiornamenti, utilizzando ON UPDATE CASADE
.
NO ACTION
è il valore predefinito, quindi avremmo potuto fare a meno di quelle ultime due righe di codice. Tuttavia, l'ho incluso, perché è un fattore importante a cui pensare quando si creano vincoli di chiave esterna.
Aggiungi una relazione a una tabella esistente
L'esempio precedente crea una relazione contemporaneamente alla creazione delle tabelle. Tuttavia, a volte potrebbe essere necessario aggiungere una relazione a una tabella esistente.
Aggiungiamo una nuova relazione tra i Genres
e Albums
tabelle.
Esegui il codice seguente:
USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ;
Questo crea una nuova chiave esterna negli Albums
tavolo. Risulta in Albums.GenreId
diventando una chiave esterna che fa riferimento a Genres.GenreId
.
Quindi l'esecuzione di tale istruzione comporta la visualizzazione di una nuova chiave esterna sotto le Chiavi nodo:
Chiavi esterne a colonna singola
Le chiavi esterne a colonna singola (come quella sopra) possono essere specificate anche a livello di colonna. Quindi un altro modo per creare gli Albums
table e la sua chiave esterna è così:
CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL );
Questo metodo non può essere utilizzato su vincoli di chiave multicolonna, quindi per quelli, usa la sintassi nell'esempio originale sopra.
Chiavi esterne multicolonna
Una chiave esterna multicolonna è il punto in cui viene utilizzata più di una colonna per la chiave esterna. Viene in genere utilizzato quando la tabella padre utilizza più colonne per la sua chiave primaria. Questo potrebbe essere il caso se la tabella padre combina i valori di due colonne per creare un valore univoco.
Le chiavi esterne multicolonna possono essere create usando la sintassi nell'esempio originale sopra. Basta aggiungere il nome di ogni colonna separato da una virgola.
Quindi se immaginiamo che gli Albums
la tabella ha anche un ArtistName
colonna (e che il Artists
la tabella utilizza ArtistId
e ArtistName
come chiave primaria), una chiave esterna multicolonna sarebbe simile a questa:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)