MySQL ON DELETE CASCADE
Zusammenfassung: In diesem Tutorium lernen Sie, wie Sie die MySQL ON DELETE CASCADE
referentielle Aktion für einen Fremdschlüssel verwenden, um Daten aus mehreren Bezugstabellen zu löschen.
Im vorherigen Tutorium haben Sie gelernt, wie Sie Daten aus mehreren Bezugstabellen mit einer einzigen DELETE
-Anweisung löschen. MySQL bietet jedoch eine effektivere Methode, die ON DELETE CASCADE
referentielle Aktion für einen Fremdschlüssel genannt wird, die es Ihnen ermöglicht, Daten aus untergeordneten Tabellen automatisch zu löschen, wenn Sie die Daten aus der übergeordneten Tabelle löschen.
MySQL ON DELETE CASCADE Beispiel
Lassen Sie uns einen Blick auf ein Beispiel für die Verwendung von MySQL ON DELETE CASCADE
werfen.
Angenommen, wir haben zwei Tabellen:buildings
und rooms
. In diesem Datenbankmodell hat jedes Gebäude einen oder mehrere Räume. Jeder Raum gehört jedoch nur zu einem Gebäude. Ein Raum würde ohne ein Gebäude nicht existieren.
Die Beziehung zwischen den Tabellen buildings
und rooms
ist eins-zu-viele (1:N), wie im folgenden Datenbankdiagramm dargestellt:
Wenn Sie eine Zeile aus der Tabelle buildings
löschen, möchten Sie auch alle Zeilen in der Tabelle rooms
löschen, die auf die Zeile in der Tabelle buildings
verweisen. Wenn Sie z. B. eine Zeile mit der Gebäude-Nr. 2 in der Tabelle buildings
mit der folgenden Abfrage löschen:
Code language: SQL (Structured Query Language) (sql)
Sie möchten auch, dass die Zeilen in der Tabelle rooms
, die sich auf die Gebäudenummer 2 beziehen, ebenfalls entfernt werden.
Nachfolgend finden Sie Schritte, die zeigen, wie die referenzielle Aktion ON DELETE CASCADE
funktioniert.
Schritt 1. Erstellen Sie die Tabelle buildings
:
Code language: SQL (Structured Query Language) (sql)
Schritt 2. Erstellen Sie die Tabelle rooms
:
Code language: SQL (Structured Query Language) (sql)
Achten Sie auf die ON DELETE CASCADE
-Klausel am Ende der Definition der Fremdschlüssel-Beschränkung.
Schritt 3. Fügen Sie Zeilen in die Tabelle buildings
ein:
Code language: SQL (Structured Query Language) (sql)
Schritt 4. Abfrage von Daten aus der Tabelle buildings
:
Code language: SQL (Structured Query Language) (sql)
Wir haben zwei Zeilen in der Tabelle buildings
.
Schritt 5. Zeilen in die Tabelle rooms
einfügen:
Code language: SQL (Structured Query Language) (sql)
Schritt 6. Daten aus der Tabelle rooms
abfragen:
Code language: SQL (Structured Query Language) (sql)
Wir haben drei Räume, die zum Gebäude Nr. 1 gehören und zwei Räume, die zum Gebäude Nr. 2 gehören.
Schritt 7. Lösche das Gebäude mit der Gebäude-Nr. 2:
Code language: SQL (Structured Query Language) (sql)
Schritt 8. Daten aus der Tabelle rooms
abfragen:
Code language: SQL (Structured Query Language) (sql)
Wie Sie sehen können, wurden alle Zeilen, die auf building_no
2 verweisen, automatisch gelöscht.
Beachten Sie, dass ON DELETE CASCADE
nur mit Tabellen mit Speichermotoren funktioniert, die Fremdschlüssel unterstützen, z.B., InnoDB.
Einige Tabellentypen unterstützen keine Fremdschlüssel, wie z.B. MyISAM, daher sollten Sie geeignete Speicher-Engines für die Tabellen wählen, für die Sie die MySQL ON DELETE CASCADE
referentielle Aktion verwenden wollen.
Tipps zum Auffinden von Tabellen, die von der MySQL ON DELETE CASCADE Aktion betroffen sind
Manchmal ist es nützlich zu wissen, welche Tabelle von der ON DELETE CASCADE
referentiellen Aktion betroffen ist, wenn Sie Daten aus einer Tabelle löschen. Sie können diese Daten aus der referential_constraints
in der information_schema
-Datenbank wie folgt abfragen:
Code language: SQL (Structured Query Language) (sql)
Um beispielsweise Tabellen zu finden, die mit der buildings
-Tabelle mit der CASCADE
-Löschregel in der classicmodels
-Datenbank verbunden sind, verwenden Sie die folgende Abfrage:
Code language: SQL (Structured Query Language) (sql)