MySQL DELETE in mehreren Tabellen mit Pärzedenz durch Klammern in WHERE für OR/AND

profy

Mitglied
Moin Moin,
erst mal Entschuldigung für den langen Titel, sollte aber alles enthalten, was ich vergeblich in google gesucht habe.

Kurz das Ziel: Aus mehreren Tabellen die Zeilen löschen. Alle Unternehmen und Verknüpfungen mit Ansprechpartnern löschen, die in der PLZ 0 oder NULL haben.

Mein Versuch;
SQL:
DELETE FROM unternehmen, unternehmen2ansprechpartner 
WHERE unternehmen.id=unternehmen2ansprechpartner.unternehmen_id
AND (unternehmen.post_plz IS NULL OR unternehmen.post_plz = 0)

Fehlermeldung:
Code:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE unternehmen.id=unternehmen2ansprechpartner.unternehmen_id
AND (unt' at line 2
SQLState:  42000
ErrorCode: 1064
Es handelt sich um MySQL 5.0.X

Keine Ahnung was da falsch sein kann.
Würde ich die Klammern weglassen, wäre der Ausdruck falsch, weil durch Präzedenz-Regeln AND vor OR verarbeitet wird.

Vielen Dank für Eure Hilfe im Voraus.
VG
Sven
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

die von dir verwendete DELETE-Syntax ist falsch. Laut Handbuch gibt es zwei Möglichkeiten, ein Löschen aus mehreren Tabellen in eine Abfrage zu gießen:
  • DELETE tbl_name[.*] [, tbl_name[.*]]… FROM table_references [WHERE where_condition]
  • DELETE FROM tbl_name[.*] [, tbl_name[.*]]… USING table_references [WHERE where_condition]
Deine Abfrage entspricht keiner von beiden.

Abgesehen davon löst man das Löschen von abhängigen Datensätzen in der Regel mit Foreign Key Constraints.

Grüße,
Matthias
 
Vielen Dank für die Antwort.
Die Syntax allgemein und das zweite Beispiel im Handbuch scheinen sich zu widersprechen oder?

Mit Foreign Key Constraints wäre es natürlich perfekt, aber die Welt ist nicht immer perfekt und man muss sich mit sowas rumärgern :(
 
Hallo,

meinst du dieses Beispiel?
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

Or:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;
Ich kann da nämlich keinen Widerspruch entdecken.

Grüße,
Matthias
 
Mal ein bischen Datenbank-Theorie am Rande:

Das Löschen von abhängigen Datensätzen kann man mit Foreign Key Constraints lösen, aber es gibt auch Gründe, die dagegen sprechen !

In erster Linie den, daß Constraints der absolute Performance-Killer sind und für hochperformante Datenbank-Anwendungen mit großen Datenbeständen absolut ungeeignet. Sie erleichtern allerdings dem Entwickler die Arbeit, weil er sich um die saubere DB-Programmierung nicht mehr kümmern muß, wenn er die Spielregeln (Constraints) einmal dem DB-System mitgeteilt hat.
 
Dafür braucht man wirklich keinen Benchmark, sondern einfach Erfahrung aus der Entwicklung großer Datenbanken.

Der Zusammenhang ist aber auch klar:

Das DBS muß bei eingesetzten Constraints ständig alle Aktivitäten auf der DB überwachen, ob irgendeine der Regeln beachtet werden muß. Bei nicht absolut simplen DB's sind diese Regeln dann zumeist auch noch verkettet, damit ist es ganz leicht einen Server in die Knie zu zwingen. Ich als Entwickler kenne aber die Abhängigkeiten zum jeweiligen Zeitpunkt und kann diese in der Regel mit einem (oder einigen wenigen) SQL-Statement(s) zur Geltung bringen (DELETE USING).

Eine Löschanweisung mit Constraints kann dann unter Umständen schonmal ein vielfaches an Zeit benötigen (30-fach und mehr schon erlebt), das sieht man dann auch ohne Benchmarks ...
 
Zurück