Vincoli FOREIGN KEY

Per chiave esterna si intende una colonna o combinazione di colonne utilizzata per stabilire e applicare un collegamento tra i dati di due tabelle. Per creare una chiave esterna, è possibile definire un vincolo FOREIGN KEY in fase di creazione o di modifica di una tabella.

In un riferimento a una chiave esterna viene creato un collegamento tra tabelle quando le colonne contenenti il valore della chiave primaria per una tabella vengono utilizzate come riferimento dalle colonne di un'altra tabella. Questa colonna diventa una chiave esterna nella seconda tabella.

Nella tabella Sales.SalesOrderHeader all'interno del database AdventureWorks2008R2, ad esempio, è incluso un collegamento alla tabella Sales.SalesPerson, in quanto esiste una relazione logica tra gli ordini di vendita e i venditori. La colonna SalesPersonID della tabella SalesOrderHeader corrisponde alla colonna chiave primaria della tabella SalesPerson. La colonna SalesPersonID della tabella SalesOrderHeader rappresenta la chiave esterna alla tabella SalesPerson.

SalesOrderHeader.SalesPersonID è una chiave esterna.

Un vincolo FOREIGN KEY può anche non essere collegato esclusivamente al vincolo PRIMARY KEY di un'altra tabella. Può infatti essere definito in modo da fare riferimento alle colonne di un vincolo UNIQUE in un'altra tabella. Un vincolo FOREIGN KEY può includere valori Null. Tuttavia, se una colonna di un vincolo FOREIGN KEY composto include valori Null, la verifica di tutti i valori che formano il vincolo FOREIGN KEY verrà ignorata. Per assicurarsi che tutti i valori di un vincolo FOREIGN KEY composto vengano verificati, specificare NOT NULL in tutte le colonne coinvolte.

Nota

Un vincolo FOREIGN KEY può fare riferimento alle colonne delle tabelle dello stesso database oppure della stessa tabella. Tali tabelle sono denominate tabelle autoreferenziali. Si consideri, ad esempio, una tabella di dipendenti contenente tre colonne: employee_number, employee_name, e manager_employee_number. Poiché anche il responsabile è un dipendente, esiste una relazione di chiave esterna tra le colonne manager_employee_number e employee_number.

Integrità referenziale

Benché lo scopo primario di un vincolo FOREIGN KEY consista nel controllare i dati che è possibile archiviare nella tabella della chiave esterna, tale vincolo controlla inoltre le modifiche apportate ai dati nella tabella della chiave primaria. Se, ad esempio, la riga relativa a un venditore viene eliminata dalla tabella Sales.SalesPerson e l'ID del venditore viene utilizzato per gli ordini di vendita inclusi nella tabella Sales.SalesOrderHeader, viene interrotta l'integrità referenziale tra le due tabelle. Gli ordini di vendita del venditore eliminato risultano isolati (orfani) nella tabella SalesOrderHeader e privi di un collegamento ai dati inclusi nella tabella SalesPerson.

Un vincolo FOREIGN KEY impedisce questa situazione e applica l'integrità referenziale assicurando che non sia possibile apportare modifiche alla tabella della chiave primaria se tali modifiche annullano il collegamento ai dati della tabella della chiave esterna. Se si tenta di eliminare la riga in una tabella della chiave primaria oppure di modificare un valore della chiave primaria, l'azione avrà esito negativo se il valore della chiave primaria eliminato o modificato corrisponde a un valore nel vincolo FOREIGN KEY di un'altra tabella. Per modificare o eliminare correttamente una riga in un vincolo FOREIGN KEY, è necessario innanzitutto modificare o eliminare i dati della chiave esterna nella tabella della chiave esterna e collegare quindi la chiave esterna ad altri dati della chiave primaria.

Indicizzazione dei vincoli FOREIGN KEY

La creazione di un indice in una chiave esterna rappresenta spesso un'operazione utile per i motivi seguenti:

  • Le modifiche apportate ai vincoli PRIMARY KEY vengono confrontate con i vincoli FOREIGN KEY nelle tabelle correlate.

  • Le colonne chiave primaria vengono in genere utilizzate nei criteri di join quando i dati provenienti da tabelle correlate vengono riuniti in query confrontando le colonne nel vincolo FOREIGN KEY di una tabella con le colonne chiave primaria o univoca nell'altra tabella. Un indice consente a Motore di database di trovare rapidamente i dati correlati nella tabella della chiave esterna. La creazione di questo indice, tuttavia, non è un requisito necessario. È possibile riunire i dati di due tabelle correlate anche se non è stato definito alcun vincolo PRIMARY KEY o FOREIGN KEY tra le tabelle, ma una relazione di chiave esterna tra due tabelle indica che le due tabelle sono state ottimizzate per essere riunite in una query che utilizza le chiavi come criteri. Per ulteriori informazioni sull'utilizzo dei vincoli FOREIGN KEY con i join, vedere Nozioni fondamentali sui join e Tipi di query e indici.

Numero di vincoli FOREIGN KEY in una tabella

In SQL Server non esiste un limite predefinito al numero di vincoli FOREIGN KEY che può contenere una tabella e che fanno riferimento ad altre tabelle, né al numero di vincoli FOREIGN KEY posseduti da altre tabelle che fanno riferimento a una tabella specifica. In genere, tuttavia, il numero effettivo di vincoli FOREIGN KEY è limitato dalla configurazione hardware e dalla progettazione del database e dell'applicazione. È consigliabile evitare che una tabella contenga più di 253 vincoli FOREIGN KEY e che più di 253 vincoli FOREIGN KEY facciano riferimento alla tabella. Valutare l'eventuale costo dell'applicazione di vincoli FOREIGN KEY durante la progettazione del database e delle applicazioni.