MySQL: Aus 2 Tabellen per JOIN löschen (DELETE)
In relationalen Datenbanken wird man in einigen Fällen n:m-Beziehungen haben. Diese Beziehungen setzt man in der Regel so um, dass man eine extra Tabelle erstellt, in der die Primärschlüssel der beiden Tabellen, zwischen denen die n:m-Beziehung besteht, als Fremdschlüssel hinterlegt sind. In bestimmten Fällen müssen Datensätze in dieser Tabelle gelöscht werden. Der Wert bzw. das Auswahlkriterium zum Löschen steht jedoch in einer der beiden Haupttabellen. Um die Abfrage in möglichst einem Query zu lösen, muss die Beziehungstabelle also mit einer der Tabellen über einen JOIN verbunden werden.
Die Löschanfrage (DELETE) sieht in solchen Fällen ein wenig anders aus, als der „normale“ DELETE-Query. Wenn wir eine Tabelle haben, dann sieht das Löschen in der Regel so aus:
1 |
mysql_query("DELETE FROM tabelle WHERE id = '5'"); |
Wenn man nun mehrere Tabellen mit einander verbinden möchte, und in der Beziehungstabelle den Eintrag löschen möchte, dann sieht der Query folgermaßen aus:
1 2 3 4 5 6 7 8 |
mysql_query(" DELETE bt FROM beziehungstabelle AS bt JOIN haupttabelle AS haupt ON bt.f_id = haupt.id WHERE haupt.eigenschaft = '5' "); |
In diesem Beispiel werden alle Einträge mit dem Wert 5 im Feld „eigenschaft“ nur in der Beziehungstabellen (n:m) gelöscht. Der Eintrag in der Haupttabelle bleibt beim Löschen unberührt und weiterhin bestehen. Den Haupteintrag aus der Tabelle kann man mit einer kleinen Ergänzung ebenfalls gleich mitlöschen lassen. Dazu muss man nach dem DELETE noch den Alias der Haupttabelle anhängen. Das Beispiel würde dann ausgehend vom oberen Code so aussehen:
1 2 3 4 5 6 7 8 |
mysql_query(" DELETE bt, haupt FROM beziehungstabelle AS bt JOIN haupttabelle AS haupt ON bt.f_id = haupt.id WHERE haupt.eigenschaft = '5' "); |
Die Änderung ist in diesem Fall das Anhängen des Alias haupt in der Tabellenaufzählung. Diese Anfrage an die Datenbank löscht nun den Datensatz mit der Wert eigenschaft = 5 sowohl in der MySQL-Tabelle mit den n:m Beziehungen, als auch in der Tabelle in der das Feld eigenschaft angelegt ist. Man könnte die Tabellenanzahl je nach Bedarf um weitere JOINs erweitern, wenn man beispielsweise zusätzliche Bedingungen in der WHERE Klausel aufzählen will und die ensprechenden Werte dabei in separaten Tabellenfeldern gespeichert sind.
Die letzten Kommentare