Nozioni di base sulle chiavi esterne in MySQL?


91

C'è qualche buona spiegazione su come utilizzare il costrutto di chiave esterna di MySQL?

Non l'ho capito dai documenti MySQL stessi. Fino ad ora ho gestito cose come chiavi esterne con join e codice di programmazione.

E la seconda parte della domanda, ci sono miglioramenti da apportare utilizzando le chiavi esterne integrate di MySQL?

Risposte:


117

FOREIGN KEYS assicurati solo che i tuoi dati siano coerenti.

Non migliorano le query in termini di efficienza, semplicemente fanno fallire alcune query sbagliate.

Se hai una relazione come questa:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, quindi non è possibile eliminare a departmentse ne ha alcuni employee.

Se si fornisce ON DELETE CASCADEla FOREIGN KEYdefinizione, le righe di riferimento verranno eliminate automaticamente insieme a quelle di riferimento.

Come vincolo, in FOREIGN KEYrealtà rallenta un po 'le query.

È necessario eseguire un controllo aggiuntivo quando si elimina da una tabella di riferimento o si inserisce in una tabella di riferimento.


1
Il rallentamento è minimo, perché di solito fai FK sui campi indicizzati, il che rende la ricerca dei valori rilevanti un gioco da ragazzi.
Seb

4
Ecco perché ho scritto "un po '" :) In realtà, se cancelli molte righe, il sottostante JOINpotrebbe essere molto meno efficiente di due DELETE usando FULL TABLE SCAN
Quassnoi

2
Ci scusiamo per il voto negativo. È stato accidentale, ma non mi permette di cambiare il mio voto.
Wondercricket

8
@Wondercricket: non so nemmeno cosa fare ora, è un'area grigia nelle regole del sito. Penso che mi offri una birra quando sei a Mosca e siamo pari.
Quassnoi

1
@stack: qualsiasi aggiornamento che fai alle chiavi referenziate si sovrappone alla tabella di riferimento.
Quassnoi

32

I principali vantaggi dell'utilizzo di chiavi esterne reali sono la garanzia dell'integrità dei dati e la possibilità di impostare azioni a cascata sugli elementi correlati quando qualcosa viene modificato o eliminato.

Ad esempio, immagina di programmare un forum. Hai una tabella "argomenti" con chiave primaria topics.topic_ide una tabella "post" in cui i post sono allegati agli argomenti con la colonna posts.topic_id, che è una chiave esterna per la tabella degli argomenti.

Questa relazione di chiave esterna garantisce che ogni post sia allegato a un argomento valido. Se l'unico argomento che hai ha l'ID # 1, è impossibile che esista un post nel database allegato all'argomento # 2. Il database lo garantisce.

Per il vantaggio della cascata, puoi configurarlo in modo che se un argomento viene eliminato dalla tabella degli argomenti, il database elimina automaticamente tutti i post nella tabella dei post che erano allegati a questo argomento. Questo è bello perché rimuove un passaggio che devi ricordarti di fare manualmente, che può diventare piuttosto complesso quando hai molte tabelle collegate tra loro. Con le chiavi esterne tutte le relazioni possono essere pulite automaticamente.


11

1.TASTI ESTERNI assicurati che i tuoi dati siano coerenti.

2. Se applichiamo l'eliminazione a cascata alla definizione di chiave esterna, la riga di riferimento verrà eliminata automaticamente quando verrà eliminata la riga padre.

3. Se applichiamo Update Cascade alla definizione di chiave esterna, la riga figlia si aggiornerà automaticamente quando si aggiornerà la riga padre.

Query: ALTER TABLE figlio AGGIUNGI CHIAVE ESTERA (parent_id) RIFERIMENTI genitore (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. non è possibile eliminare la tabella genitore diretta, eliminare prima la chiave esterna dalla tabella figlia che eliminare la tabella padre.

7
Alla fine ho capito cosa mi ha confuso sugli esempi di chiavi esterne. Come padre di quattro figli, non sono abituato al fatto che il bambino tenga traccia del genitore . Tra altri quarant'anni o giù di lì questo potrebbe non sembrare più indietro.
Bob Stein

1
Grazie per aver dato alle tue tabelle di esempio nomi come "figlio" e "genitore" ... in realtà è piuttosto utile e vorrei che lo facesse la documentazione ufficiale!
mike rodent

7

Il vantaggio principale è che puoi limitare i valori che puoi inserire nella tabella; se provi a inserire un valore che non esiste nella tabella di riferimento, non sarai in grado di farlo.

Inoltre, se aggiorni o elimini il valore nella tabella di riferimento, puoi impostarlo per aggiornare automaticamente il valore o eliminare in cascata qualsiasi riga contenente quel valore.

È davvero un'ottima funzionalità che sfrutta il tuo codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.