
Anhang A: Probleme und h¨aufige Fehler 643
Das WHERE-Statement wird ausgef¨uhrt, um festzulegen, welche Zeilen im GROUP BY-Teil en-
thalten sein sollen, w¨ahrend HAVING benutzt wird, um zu entscheiden, welche Zeilen der
Ergebnismenge benutzt werden sollten.
A.5.5 Zeilen aus verwandten Tabellen l¨oschen
Weil MySQL keine Sub-Selects oder die Benutzung von mehr als einer Tabelle im DELETE-
Statement unterst¨utzt, m¨ussen Sie folgenden Ansatz w¨ahlen, um Zeilen aus zwei verwandten
Tabellen zu l¨oschen:
1. W¨ahlen (SELECT) Sie die Zeilen auf der Grundlage einer WHERE-Bedingung in der Haupt-
Tabelle aus.
2. L¨oschen (DELETE) Sie die Zeilen in der Haupt-Tabelle auf der Grundlage derselben
Bedingung.
3. L¨oschen Sie die Zeilen aus der verwandten Tabelle, bei denen die verwandte Spalte
in den ausgew¨ahlten Zeilen vorkommt (DELETE FROM verwandte_tabelle WHERE
verwandte_spalte IN (ausgewaehlte_zeilen).
Wenn die Gesamtzahl von Zeichen in der Anfrage mit verwandte_spalte mehr als 1.048.576
betr¨agt (der Vorgabewert von max_allowed_packet, sollten Sie sie in kleinere Teile auf-
spalten und mehrfache DELETE-Statements ausf¨uhren. Wahrscheinlich geht das L¨oschen
(DELETE) am Schnellsten, wenn Sie nur 100 bis 1000 verwandte_spalte-Kennungen pro
Anfrage l¨oschen, wenn verwandte_spalte ein Index ist. Wenn verwandte_spalte kein
Index ist, ist die Geschwindigkeit unabh¨angig von der Anzahl von Argumenten in der IN-
Klausel.
A.5.6 Probleme bei keinen ¨ubereinstimmenden Zeilen l¨osen
Wenn Sie eine komplizierte Anfrage hab en, die viele Tabellen hat und keine Zeilen
zur¨uckgibt, sollten Sie folgende Prozedur benutzen, um herauszufinden, was bei Ihrer
Anfrage falsch ist:
1. Testen Sie die Anfrage mit EXPLAIN und pr¨ufen Sie, ob Sie etwas finden k¨onnen, das
offensichtlich falsch ist. Siehe Abschnitt 6.2.1 [EXPLAIN], Seite 329.
2. W¨ahlen Sie in der WHERE-Klausel nur die Felder aus, die benutzt werden.
3. Entfernen Sie nacheinander Tabelle f¨ur Tabelle aus der Anfrage, bis sie Zeilen
zur¨uckgibt. Wenn die Tabellen Groß sind, ist es eine gute Idee, LIMIT 10 bei der
Anfrage zu benutzen.
4. Machen Sie ein SELECT f¨ur die Spalte, die mit einer Zeile h¨atte ¨ubereinstimmen sollen,
gegen die Tabelle, die als letzte aus der Anfrage entfernt wurde.
5. Wenn Sie FLOAT- oder DOUBLE-Spalten mit Zahlen vergleichen, die Dezimal-
stellen haben, k¨onnen Sie nicht = benutzen! Das Problem tritt in den meisten
Computersprachen auf, weil Fließkommawerte keine exakten Werte sind:
mysql> SELECT * FROM tabelle WHERE float_spalte=3.5;
mysql> SELECT * FROM tabelle WHERE float_spalte between 3.45 und 3.55;
In den meisten F¨allen kann dies durch Umwandlung von FLOAT in DOUBLE behoben
werden!
Kommentare zu diesen Handbüchern