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



## profy (23. Mai 2008)

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;

```
DELETE FROM unternehmen, unternehmen2ansprechpartner 
WHERE unternehmen.id=unternehmen2ansprechpartner.unternehmen_id
AND (unternehmen.post_plz IS NULL OR unternehmen.post_plz = 0)
```

Fehlermeldung:

```
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


----------



## Matthias Reitinger (23. Mai 2008)

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


----------



## profy (28. Mai 2008)

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


----------



## Matthias Reitinger (29. Mai 2008)

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:
> ...


Ich kann da nämlich keinen Widerspruch entdecken.

Grüße,
Matthias


----------



## old_thrashbarg (1. Oktober 2008)

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.


----------



## dbwizard (1. Oktober 2008)

old_thrashbarg hat gesagt.:


> Performance-Killer



- Wie dass ? Hast du einen Testcase ? Benchmark ?


Gruss


----------



## old_thrashbarg (1. Oktober 2008)

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 ...


----------

