MySQL ON DELETE CASCADE

Souhrn: v tomto tutoriálu se naučíte používat referenční akci MySQL ON DELETE CASCADE pro cizí klíč k mazání dat z více souvisejících tabulek.

V předchozím tutoriálu jste se naučili mazat data z více souvisejících tabulek pomocí jednoho příkazu DELETE. MySQL však poskytuje efektivnější způsob zvaný ON DELETE CASCADE referenční akce pro cizí klíč, který umožňuje automaticky odstranit data z podřízených tabulek, když odstraníte data z nadřazené tabulky.

Příklad MySQL ON DELETE CASCADE

Podívejme se na příklad použití MySQL ON DELETE CASCADE .

Předpokládejme, že máme dvě tabulky:buildings a rooms . V tomto databázovém modelu má každá budova jednu nebo více místností. Každá místnost však patří pouze k jedné budově. Místnost by bez budovy neexistovala.

Vztah mezi tabulkami buildings a rooms je one-to-many (1:N), jak je znázorněno na následujícím databázovém diagramu:

Když odstraníte řádek z tabulky buildings, chcete také odstranit všechny řádky v tabulce rooms, které odkazují na řádek v tabulce buildings. Například když odstraníte řádek s budovou č. 2 v tabulce buildings podle následujícího dotazu:

Code language: SQL (Structured Query Language) (sql)

Chcete, aby byly odstraněny také řádky v tabulce rooms, které odkazují na budovu č. 2.

Následují kroky, které demonstrují, jak funguje odkazovací akce ON DELETE CASCADE.

Krok 1. Odstranění řádku s budovou č. 2 z tabulky rooms. Vytvoření tabulky buildings:

Code language: SQL (Structured Query Language) (sql)

Krok 2. Vytvořte tabulku rooms:

Code language: SQL (Structured Query Language) (sql)

Všimněte si, že na konci definice omezení cizího klíče je klauzule ON DELETE CASCADE.

Krok 3. Vytvořte tabulku rooms. Vložte řádky do tabulky buildings:

Code language: SQL (Structured Query Language) (sql)

Krok 4. Vložte řádky do tabulky buildings. Dotaz na data z tabulky buildings:

Code language: SQL (Structured Query Language) (sql)

V tabulce buildings máme dva řádky.

Krok 5. V tabulce buildings vytvoříme dva řádky. Vložíme řádky do tabulky rooms:

Code language: SQL (Structured Query Language) (sql)

Krok 6. Vložíme řádky do tabulky rooms. Dotaz na data z tabulky rooms:

Code language: SQL (Structured Query Language) (sql)

Máme tři místnosti, které patří k budově č. 1, a dvě místnosti, které patří k budově č. 2.

Krok 7. V tabulce rooms se zobrazí údaje z tabulky rooms. Vymažte budovu s budovou č. 2:

Code language: SQL (Structured Query Language) (sql)

Krok 8. Dotaz na data z tabulky rooms:

Code language: SQL (Structured Query Language) (sql)

Jak vidíte, všechny řádky, které odkazují na building_no 2, byly automaticky odstraněny.

Poznamenejte, že ON DELETE CASCADE funguje pouze s tabulkami s úložnými mechanismy, které podporují cizí klíče, např, InnoDB.

Některé typy tabulek nepodporují cizí klíče, jako například MyISAM, proto byste měli pro tabulky, u kterých plánujete použít referenční akci MySQL ON DELETE CASCADE, zvolit vhodné úložné motory.

Tipy pro vyhledání tabulek, kterých se týká akce MySQL ON DELETE CASCADE

Někdy je užitečné vědět, které tabulky se týká referenční akce ON DELETE CASCADE při mazání dat z tabulky. Na tato data se můžete zeptat pomocí dotazu referential_constraints v databázi information_schema takto:

Code language: SQL (Structured Query Language) (sql)

Příklad pro vyhledání tabulek, které jsou spojeny s tabulkou buildings s pravidlem mazání CASCADE v databázi classicmodels, použijete následující dotaz:

Code language: SQL (Structured Query Language) (sql)

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.