MySQL ON DELETE CASCADE
Sommario: in questo tutorial, imparerai come usare MySQL ON DELETE CASCADE
azione referenziale per una chiave esterna per cancellare i dati da più tabelle correlate.
Nel tutorial precedente, hai imparato come cancellare i dati da più tabelle correlate usando una singola istruzione DELETE
. Tuttavia, MySQL fornisce un modo più efficace chiamato ON DELETE CASCADE
azione referenziale per una chiave esterna che permette di eliminare i dati dalle tabelle figlie automaticamente quando si eliminano i dati dalla tabella madre.
MySQL ON DELETE CASCADE esempio
Diamo un’occhiata a un esempio di utilizzo di MySQL ON DELETE CASCADE
.
Supponiamo di avere due tabelle:buildings
e rooms
. In questo modello di database, ogni edificio ha una o molte stanze. Tuttavia, ogni stanza appartiene ad un solo edificio. Una stanza non esisterebbe senza un edificio.
La relazione tra le tabelle buildings
e rooms
è uno-a-molti (1:N) come illustrato nel seguente diagramma del database:
Quando cancelli una riga dalla tabella buildings
, vuoi anche cancellare tutte le righe nella tabella rooms
che fanno riferimento alla riga nella tabella buildings
. Per esempio, quando cancellate una riga con l’edificio no. 2 nella tabella buildings
come la seguente query:
Code language: SQL (Structured Query Language) (sql)
Vuoi anche che le righe nella tabella rooms
che si riferiscono all’edificio numero 2 vengano rimosse.
I seguenti passi dimostrano come funziona l’azione referenziale ON DELETE CASCADE
.
Passo 1. Creare la tabella buildings
:
Code language: SQL (Structured Query Language) (sql)
Passo 2. Creare la tabella rooms
:
Code language: SQL (Structured Query Language) (sql)
Nota che la clausola ON DELETE CASCADE
alla fine della definizione del vincolo di chiave esterna.
Passo 3. Inserire righe nella tabella buildings
:
Code language: SQL (Structured Query Language) (sql)
Passo 4. Interrogare i dati della tabella buildings
:
Code language: SQL (Structured Query Language) (sql)
Abbiamo due righe nella tabella buildings
.
Step 5. Inserire le righe nella tabella rooms
:
Code language: SQL (Structured Query Language) (sql)
Passo 6. Interrogare i dati della tabella rooms
:
Code language: SQL (Structured Query Language) (sql)
Abbiamo tre stanze che appartengono all’edificio n. 1 e due stanze che appartengono all’edificio n. 2.
Step 7. Cancellare l’edificio con l’edificio no. 2:
Code language: SQL (Structured Query Language) (sql)
Passo 8. Interroga i dati dalla tabella rooms
:
Code language: SQL (Structured Query Language) (sql)
Come puoi vedere, tutte le righe che fanno riferimento a building_no
2 sono state automaticamente cancellate.
Nota che ON DELETE CASCADE
funziona solo con le tabelle con i motori di archiviazione che supportano le chiavi esterne, per esempio, InnoDB.
Alcuni tipi di tabelle non supportano le chiavi esterne come MyISAM, quindi dovresti scegliere i motori di archiviazione appropriati per le tabelle che intendi utilizzare l’azione referenziale ON DELETE CASCADE
di MySQL.
Suggerimenti per trovare le tabelle interessate dall’azione ON DELETE CASCADE di MySQL
A volte, è utile sapere quale tabella è interessata dall’azione referenziale ON DELETE CASCADE
quando elimini i dati da una tabella. Puoi interrogare questi dati dal referential_constraints
nel database information_schema
come segue:
Code language: SQL (Structured Query Language) (sql)
Per esempio, per trovare le tabelle associate alla tabella buildings
con la regola di cancellazione CASCADE
nel database classicmodels
, usi la seguente query:
Code language: SQL (Structured Query Language) (sql)