Integrità referenziale
# Integrità referenziale

Nell'ambito delle basi di dati relazionali, l'integrità referenziale è una proprietà che assicura che le relazioni tra tabelle siano coerenti. Più nello specifico, la proprietà richiede che vengano rispettati determinati vincoli di integrità di tipo interrelazionale, i quali impongono che ogni valore di un attributo (colonna) di una relazione (tabella) esista come valore di un altro attributo in un'altra relazione.

In SQL, i vincoli di integrità referenziale si esprimono solitamente tramite foreign key. Affinché sia rispettata l'integrità referenziale, ogni campo in una tabella che sia stato dichiarato come foreign key può contenere solo valori della chiave primaria o chiave candidata di una tabella "madre" relazionata.

Per esempio, cancellare un record che contiene un valore a cui fa riferimento una foreign key di un'altra tabella violerebbe l'integrità relazionale. Alcuni RDBMS possono garantire l'integrità relazionale, o cancellando le rispettive righe di foreign key (Cascade), interrompendo l'operazione e non effettuando la cancellazione (No Action), ponendo a NULL i campi contenenti la rispettiva foreign key (Set Null) oppure ponendoli al valore di default (Set Default). Spesso si può scegliere quale metodo usare attraverso un vincolo di integrità relazionale definito in un data dictionary.

## Formalizzazione

Un vincolo d'inclusione su due predicati (eventualmente coincidenti) $R$ e $S$ è indicato con $R[A_{1},...,A_{n}]\subseteq S[B_{1},...,B_{n}]$, dove i vari $A_{i}$, $B_{i}$ sono attributi (nomi delle colonne) di $R$ e $S$, rispettivamente. Ciò implica che le tuple di valori nell'insieme ordinato di attributi $A_{1},...,A_{n}$ in $R$ devono apparire anche come tuple di valori nell'insieme ordinato di attributi $B_{1},...,B_{n}$ di $S$.

Tale vincolo è una forma particolare di tuple-generating dependency (TGD) dove in entrambi i lati della regola c'è un solo atomo relazionale. In logica del primo ordine è esprimibile come $\forall {\vec {x}},{\vec {y}}.(R({\vec {x}},{\vec {y}})\rightarrow \exists {\vec {z}}.S({\vec {x}},{\vec {z}}))$, dove ${\vec {x}}$ è il vettore (di lunghezza $n$) delle variabili condivise tra gli atomi $R$ e $S$ e nessuna variabile compare più volte nel corpo né nella testa del vincolo.

