MySQL ON DELETE CASCADE
Rezumat: în acest tutorial, veți învăța cum să utilizați acțiunea referențială MySQL ON DELETE CASCADE
pentru o cheie externă pentru a șterge date din mai multe tabele înrudite.
În tutorialul anterior, ați învățat cum să ștergeți date din mai multe tabele înrudite folosind o singură instrucțiune DELETE
. Cu toate acestea, MySQL oferă o modalitate mai eficientă numită ON DELETE CASCADE
acțiune referențială ON DELETE CASCADE
pentru o cheie străină care vă permite să ștergeți datele din tabelele copil în mod automat atunci când ștergeți datele din tabelul părinte.
MySQL ON DELETE CASCADE exemplu
Să aruncăm o privire la un exemplu de utilizare a MySQL ON DELETE CASCADE
.
Să presupunem că avem două tabele:buildings
și rooms
. În acest model de bază de date, fiecare clădire are una sau mai multe camere. Cu toate acestea, fiecare cameră aparține unei singure clădiri. O cameră nu ar exista fără o clădire.
Relația dintre tabelele buildings
și rooms
este de tip unu-la-mulțime (1:N), așa cum este ilustrat în următoarea diagramă a bazei de date:
Când ștergeți un rând din tabelul buildings
, doriți, de asemenea, să ștergeți toate rândurile din tabelul rooms
care fac referire la rândul din tabelul buildings
. De exemplu, atunci când ștergeți un rând cu clădirea nr. 2 din tabelul buildings
ca următoarea interogare:
Code language: SQL (Structured Query Language) (sql)
Doriți, de asemenea, ca rândurile din tabelul rooms
care se referă la clădirea nr. 2 să fie, de asemenea, eliminate.
Cele ce urmează sunt pașii care demonstrează modul în care funcționează acțiunea referențială ON DELETE CASCADE
.
Pasul 1. Creați tabelul buildings
:
Code language: SQL (Structured Query Language) (sql)
Etapa 2. Creați tabela rooms
:
Code language: SQL (Structured Query Language) (sql)
Observați că clauza ON DELETE CASCADE
de la sfârșitul definiției constrângerii de cheie străină.
Etapa 3. Introduceți rânduri în tabelul buildings
:
Code language: SQL (Structured Query Language) (sql)
Etapa 4. Consultați datele din tabelul buildings
:
Code language: SQL (Structured Query Language) (sql)
Avem două rânduri în tabelul buildings
.
Etapa 5. Inserăm rânduri în tabelul rooms
:
Code language: SQL (Structured Query Language) (sql)
Etapa 6. Interogăm datele din tabelul rooms
:
Code language: SQL (Structured Query Language) (sql)
Avem trei camere care aparțin clădirii nr. 1 și două camere care aparțin clădirii nr. 2.
Etapa 7. Se șterge clădirea cu clădirea nr. 2:
Code language: SQL (Structured Query Language) (sql)
Etapa 8. Se interoghează datele din tabelul rooms
:
Code language: SQL (Structured Query Language) (sql)
După cum se poate observa, toate rândurile care fac referire la building_no
2 au fost șterse automat.
Rețineți că ON DELETE CASCADE
funcționează numai cu tabele cu motoare de stocare care suportă chei străine de ex, InnoDB.
Câteva tipuri de tabele nu acceptă chei străine, cum ar fi MyISAM, astfel încât ar trebui să alegeți motoare de stocare adecvate pentru tabelele pentru care intenționați să utilizați acțiunea referențială MySQL ON DELETE CASCADE
.
Consiliere pentru a găsi tabelele afectate de acțiunea MySQL ON DELETE CASCADE
Câteodată, este util să știți ce tabel este afectat de acțiunea referențială ON DELETE CASCADE
atunci când ștergeți date dintr-un tabel. Puteți interoga aceste date din referential_constraints
în baza de date information_schema
după cum urmează:
Code language: SQL (Structured Query Language) (sql)
De exemplu, pentru a găsi tabelele care sunt asociate tabelului buildings
cu regula de ștergere CASCADE
în baza de date classicmodels
, se utilizează următoarea interogare:
Code language: SQL (Structured Query Language) (sql)
.