FOREIGN KEY in SQL e relazione tra tabelle

vincolo foreign key tra tabelle di un database SQL Server

Con il termine Foreign Key (chiave esterna) indichiamo un particolare tipo di vincolo sui dati di una tabella di un database relazionale. Una colonna con una Foreign Key potrà contenere solo i dati già presenti nella Primary Key (chiave primaria) di un’altra tabella, specificata nella definizione del vincolo di chiave esterna.

Prima di studiare la sintassi SQL per creare una chiave esterna, è fondamentale conoscere le tipologie di relazioni che sussistono tra le entità di un database, in quanto la necessità di creare Foreign Key deriva direttamente dalla loro presenza.

 

Tipologia di relazioni tra tabelle

Creiamo all’interno di un database di test tre tabelle relative alle entità Attori, Registi e Film. In questo articolo utilizzeremo la sintassi T-SQL di SQL Server. Se vuoi approfondire l’istruzione CREATE TABLE puoi leggere questo mio articolo https://www.yimp.it/sql-create-table/.

CREATE TABLE Attori (
IdAttore INT IDENTITY(1,1) 
         PRIMARY KEY NOT NULL,
Nome VARCHAR(50) NOT NULL,
Cognome VARCHAR(50) NOT NULL,
DataNascita date NULL);

CREATE TABLE Registi(
IdRegista INT IDENTITY(1,1) 
          PRIMARY KEY NOT NULL,
Nome VARCHAR(50) NOT NULL,
Cognome VARCHAR(50) NOT NULL,
DataNascita DATE NULL);

CREATE TABLE Film (
IdFilm INT IDENTITY(1,1) 
       PRIMARY KEY NOT NULL,
Titolo VARCHAR(100) NOT NULL,
AnnoProduzione INT NULL,
DataUscita DATE NULL,
DurataMinuti DECIMAL(18,2) NULL);

Tra le entità del database molto spesso esistono delle relazioni che possono essere classificate in quattro tipologie. Consideriamo a titolo d’esempio la coppia Regista-Film:

 

Relazione uno a molti

Un regista può dirigere molti film mentre un film può essere diretto da un solo regista. Per implementare questa relazione devo inserire una colonna nella tabella Film contenente l’indicazione del regista che dirige il film.

 

Relazione molti a uno

Un regista può dirigere un solo film mentre un film può essere diretto da più registi. In questo caso occorre inserire una colonna nella tabella Registi con l’indicazione del film che ha diretto,

 

Relazione uno a uno

Un regista può dirigere un solo film e un film può essere diretto da un solo regista. In questo caso abbiamo più soluzioni possibili:

  • inserire una colonna nella tabella Film contenente l’indicazione del regista che dirige il film;
  • inserire una colonna nella tabella Registi con l’indicazione del film che ha diretto;
  • creare una sola tabella con tutte le informazioni.

 

Relazione molti a molti

Un regista può dirigere più di un film e un film può essere diretto da più registi. In questo caso la soluzione è meno immediata: devo creare una nuova tabella contenente le associazioni tra le chiavi primarie delle due tabelle.

 

Come creare una Foreign Key in SQL

Per il caso specifico Regista-Film la relazione più idonea è la uno a molti. Procediamo dunque con la modifica della tabella Film tramite l’istruzione ALTER TABLE:

ALTER TABLE Film ADD IdRegista INT NOT NULL

Su questa nuova colonna andremo a creare un vincolo di Chiave Esterna. Con questo vincolo non sarà possibile:

  1. inserire nella colonna IdRegista della tabella Film un valore che non è già presente nella colonna IdRegista della tabella Registi;
  2. eliminare dalla tabella Registi una riga con un IdRegista già presente nella tabella Film.

Ecco il codice SQL per la creazione della chiave esterna;

ALTER TABLE Film 
ADD FOREIGN KEY (IdRegista)
REFERENCES Registi(IdRegista);

Osserviamo che la colonna IdRegista deve essere chiave primaria della tabella Registi. Inoltre la colonna IdRegista della tabella Film potrebbe in alcuni casi anche ammettere valori null, la scelta dipenderà dal contesto.

 

Foreign Key in relazioni molti a molti

Per il caso specifico Film-Attori la relazione più idonea è la molti a molti. Creiamo dunque la tabella di associazione:

CREATE TABLE FilmAttori (
IdFilm INT NOT NULL,
IdAttore INT NOT NULL);

Su questa tabella inseriamo:

  • una chiave primaria sulla combinazione delle colonne IdFilm e IdAttore;
  • due chiavi esterne sulle colonne IdFilm e IdAttore considerate separatamente.

Ecco il codice SQL:

ALTER TABLE FilmAttori 
ADD PRIMARY KEY
(IdFilm, IdAttore);

ALTER TABLE FilmAttori 
ADD FOREIGN KEY (IdFilm)
REFERENCES Film(IdFilm);

ALTER TABLE FilmAttori 
ADD FOREIGN KEY (IdAttore)
REFERENCES Attori(IdAttore);

Anche se non è molto frequente, le tabelle di associazioni possono contenere anche altre colonne diverse dalle chiavi. L’importante è che si tratti di attributi relativi alla relazione tra attore e film, né relativi al singolo attore (in quel caso le inseriremmo nella tabella degli attori) e né al singolo regista (in quel caso li inseriremmo nella tabella dei film). In questo caso ad esempio potremmo considerare di aggiungere una colonna che indichi se l’attore è uno dei protagonisti di quel film.

 

Corsi Correlati

SQL Video Academy è il percorso di formazione ideato da me composto da più di nove ore di video-corsi e due Project work sul linguaggio SQL https://www.yimp.it/corso-sql-academy/

Torna su