MySQL ON DELETE CASCADE
Összefoglaló: Ebben a bemutatóban megtanulja, hogyan használhatja a MySQL ON DELETE CASCADE
referenciális műveletét egy idegen kulcsra, hogy adatokat töröljön több kapcsolódó táblából.
Az előző bemutatóban megtanulta, hogyan törölhet adatokat több kapcsolódó táblából egyetlen DELETE
utasítással. A MySQL azonban egy hatékonyabb módszert biztosít, az úgynevezett ON DELETE CASCADE
referenciális művelet idegen kulcsra, amely lehetővé teszi, hogy automatikusan törölje az adatokat a gyermek táblákból, amikor törli az adatokat a szülő táblából.
MySQL ON DELETE CASCADE példa
Nézzünk egy példát a MySQL ON DELETE CASCADE
használatára.
Tegyük fel, hogy van két táblánk:buildings
és rooms
. Ebben az adatbázis-modellben minden épületnek egy vagy több szobája van. Azonban minden szoba csak egy épülethez tartozik. Egy szoba nem létezne épület nélkül.
A buildings
és a rooms
táblák közötti kapcsolat egy a sokhoz (1:N), amint azt az alábbi adatbázis-diagram szemlélteti:
Amikor törölünk egy sort a buildings
táblából, a rooms
táblában is törölni akarjuk az összes olyan sort, amely a buildings
tábla sorára hivatkozik. Például, amikor töröl egy olyan sort, amelynek építési száma. 2-es számú sort a buildings
táblában a következő lekérdezés szerint:
Code language: SQL (Structured Query Language) (sql)
Az rooms
táblában lévő, a 2-es számú épületre hivatkozó sorokat is el akarja távolítani.
A következőkben a ON DELETE CASCADE
hivatkozási művelet működését bemutató lépések következnek.
1. lépés. Hozzuk létre a buildings
táblát:
Code language: SQL (Structured Query Language) (sql)
2. lépés. Hozzuk létre a rooms
táblát:
Code language: SQL (Structured Query Language) (sql)
Figyeljünk arra, hogy a ON DELETE CASCADE
záradék az idegenkulcs-kényszer definíciójának végén található.
3. lépés. Szúrjon be sorokat a buildings
táblába:
Code language: SQL (Structured Query Language) (sql)
4. lépés. Adatok lekérdezése a buildings
táblából:
Code language: SQL (Structured Query Language) (sql)
Két sorunk van a buildings
táblában.
5. lépés. Szúrjunk be sorokat a rooms
táblába:
Code language: SQL (Structured Query Language) (sql)
6. lépés. Adatok lekérdezése a rooms
táblából:
Code language: SQL (Structured Query Language) (sql)
Három szoba tartozik az 1. számú épülethez és két szoba a 2. számú épülethez.
7. lépés. Töröljük az épületet az épület sz. 2. számú épületet:
Code language: SQL (Structured Query Language) (sql)
8. lépés. Adatlekérdezés a rooms
táblából:
Code language: SQL (Structured Query Language) (sql)
Mint látható, a building_no
2. számú épületre hivatkozó összes sor automatikusan törlődött.
Megjegyezzük, hogy a ON DELETE CASCADE
csak olyan táblákkal működik, amelyeknél a tárolómotorok támogatják az idegen kulcsokat, pl., InnoDB.
Egyes táblatípusok nem támogatják az idegen kulcsokat, mint például a MyISAM, ezért megfelelő tárolómotorokat kell választania a MySQL ON DELETE CASCADE
referenciális műveletet használni szándékozó táblákhoz.
Tippek a MySQL ON DELETE CASCADE művelet által érintett táblák megtalálásához
Néha hasznos lehet tudni, hogy egy tábla adatainak törlésénél melyik táblát érinti a ON DELETE CASCADE
referenciális művelet. Ezeket az adatokat a referential_constraints
adatbázisból a information_schema
adatbázisban a következőképpen kérdezheti le:
Code language: SQL (Structured Query Language) (sql)
Ezért például a classicmodels
adatbázisban a CASCADE
törlési szabállyal a buildings
táblához kapcsolódó táblák megkereséséhez a következő lekérdezést használja:
Code language: SQL (Structured Query Language) (sql)
.