Chiave esterna
# Chiave esterna

Una chiave esterna (in inglese foreign key), nel contesto dei database relazionali, è un vincolo di integrità referenziale tra due o più tabelle. Essa identifica una o più colonne di una tabella, detta tabella referenziante, che referenzia una o più colonne di un'altra tabella, detta referenziata.

## Descrizione

I valori di un record delle colonne referenzianti devono essere presenti in un unico record della tabella referenziata. Ciò implica che un record nella tabella referenziante non può contenere valori che non esistono nella tabella referenziata, eccetto nel caso particolare di valori NULL se la colonna referenziante non è obbligatoria. Più record della tabella referenziante possono puntare allo stesso record della tabella referenziata. Nella maggior parte dei casi, ciò corrisponde alla relazione "uno a molti" tra una tabella padre ed una tabella figlio. La tabella referenziante e quella referenziata possono essere la stessa tabella. Una chiave esterna di questo tipo è anche chiamata auto-referenziante o ricorsiva. Una tabella può avere molte chiavi esterne e ogni chiave esterna può referenziare una tabella diversa.

### Azioni

Quando nella tabella referenziata si verifica un cambiamento che interessa la chiave esterna, un'azione può essere eseguita automaticamente dal DBMS per garantire l'integrità. L'azione specifica da eseguire può essere scelta dall'utente, chiave per chiave. Gli eventi che interessano la chiave primaria sono due: ON DELETE si verifica quando viene chiesta la cancellazione di un record nella tabella referenziata; ON UPDATE si verifica quando si tenta di modificare uno o più campi referenziati dalla chiave esterna.

### Tipi di corrispondenza

Gli standard SQL prevedono tre diverse modalità per trovare le corrispondenze tra i record, ognuna delle quali implica un modo diverso di trattare i valori NULL. I tre tipi sono:

* MATCH FULL: se la chiave esterna è composta da più colonne, non è possibile inserire un valore NULL in una colonna a meno che tutte le colonne non siano NULL. Se la chiave esterna è composta da una sola colonna, è possibile inserire valori NULL.
* MATCH PARTIAL: Permette di inserire valori NULL. Se la chiave esterna è composta da più colonne, è possibile inserire valori NULL in tutte le colonne o in alcune di esse.
* MATCH SIMPLE: i valori NULL non sono ammessi.

## Esempio

Consideriamo la seguente dichiarazione DDL:

Questo codice andrà a creare una tabella fattura in cui si potranno specificare un id (chiave primaria), una data_acquisto e un id_cliente. Il vincolo imposto è che id_cliente sia contenuto nella colonna id della tabella cliente.

Segue un esempio di istanza di database legale per la dichiarazione di cui sopra:

fattura :

| id | data_acquisto | id_cliente |
| - | - | - |
| 1 | 20/03/2018 | 111 |
| 2 | 20/03/2018 | 123 |
| 3 | 15/05/2020 | 111 |

cliente :

| id | nome |
| - | - |
| 111 | Wikimedia Foundation |
| 123 | Jimbo S.p.A. |
| 200 | Cool gadgets Inc. |
