PHP

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:

mysql_query("DELETE FROM tabelle WHERE id = '5'");

Wenn man nun mehrere Tabellen miteinander verbinden möchte und in der Beziehungstabelle den Eintrag löschen möchte, dann sieht der Query folgendermaßen aus:

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 Beziehungstabelle (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:

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 dem 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 entsprechenden Werte dabei in separaten Tabellenfeldern gespeichert sind.