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

Creare una relazione in SQL Server 2017

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)