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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]Consideriamo la seguente dichiarazione DDL:
CREATE TABLE fattura (
id INTEGER PRIMARY KEY,
data_acquisto DATE,
id_cliente INTEGER,
FOREIGN KEY(id_cliente) REFERENCES cliente(id) ON DELETE CASCADE
)
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. |
Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Denis Howe, foreign key, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
- Chiavi esterne in SQL-99, su kb.askmonty.org. URL consultato il 16 giugno 2013 (archiviato dall'url originale il 17 settembre 2012).
- Chiavi esterne in PostgreSQL, su postgresql.org.
- Chiavi esterne in MySQL, su dev.mysql.com.
- Chiavi esterne in FirebirdSQL, su firebirdsql.org.
- Chiavi esterne in SQLite, su sqlite.org.
- Vincoli FOREIGN KEY su Microsoft msdn, su msdn.microsoft.com.