Syntax für eine Tabelle:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROMtbl_name
[WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_count
]
Syntax für mehrere Tabellen:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]tbl_name
[.*] [,tbl_name
[.*]] ... FROMtable_references
[WHEREwhere_condition
]
Oder:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROMtbl_name
[.*] [,tbl_name
[.*]] ... USINGtable_references
[WHEREwhere_condition
]
Bei der Ein-Tabellen-Syntax löscht die
DELETE
-Anweisung Datensätze aus
tbl_name
und gibt die Anzahl
gelöschter Datensätze zurück. Sofern angegeben, bestimmt die
WHERE
-Klausel die Bedingungen dafür, welche
Datensätze gelöscht werden. Ohne
WHERE
-Klausel werden alle Datensätze
gelöscht. Wenn die ORDER BY
-Klausel
vorhanden ist, werden die Datensätze in der angegebenen
Reihenfolge gelöscht. Die LIMIT
-Klausel kann
die Anzahl der zu löschenden Datensätze beschränken.
Bei der Mehrtabellensyntax löscht DELETE
aus
jeder Tabelle tbl_name
die
Datensätze, die die Bedingungen erfüllen. In diesem Fall
können ORDER BY
und LIMIT
nicht verwendet werden.
where_condition
ist ein Ausdruck, der
für jeden zu löschenden Datensatz wahr ist. Er wird wie in
Abschnitt 13.2.7, „SELECT
“, beschrieben angegeben.
Wie bereits gesagt, löscht eine
DELETE
-Anweisung ohne
WHERE
-Klausel alle Datensätze. Wenn Sie die
Anzahl der gelöschten Datensätze nicht kennen müssen, können
Sie dies schneller mit TRUNCATE TABLE
erledigen. Siehe auch Abschnitt 13.2.9, „TRUNCATE
“.
Wenn Sie den Datensatz entfernen, der den höchsten Wert für
eine AUTO_INCREMENT
-Spalte hat, dann wird der
Wert bei BDB
-Tabellen später
wiederverwendet, nicht jedoch bei MyISAM
-
oder InnoDB
-Tabellen. Wenn Sie im
AUTOCOMMIT
-Modus alle Datensätze in der
Tabelle mit DELETE FROM
(ohne
tbl_name
WHERE
-Klausel) löschen, beginnt die Sequenz
für alle Speicher-Engines mit Ausnahme von
InnoDB
und MyISAM
neu. Bei
InnoDB
-Tabellen gibt es bezüglich dieses
Verhaltens ein paar Ausnahmen, die in
Abschnitt 14.2.6.3, „Wie eine Auto-Increment-Spalte in InnoDB funktioniert“, beschrieben
sind.
Bei MyISAM
- und
BDB
-Tabellen können Sie
AUTO_INCREMENT
in einer Sekundärspalte eines
mehrspaltigen Schlüssels angeben. In diesem Fall werden Werte,
die am Anfang der Sequenz gelöscht wurden, auch bei
MyISAM
-Tabellen wiederverwendet. Siehe auch
Abschnitt 3.6.9, „Verwendung von AUTO_INCREMENT
“.
Die DELETE
-Anweisung unterstützt die
folgenden Modifizierer:
Wenn Sie LOW_PRIORITY
angeben, verzögert
der Server die Ausführung von DELETE
,
bis kein Client mehr aus der Tabelle liest.
Wenn Sie bei MyISAM
-Tabellen das
Schlüsselwort QUICK
angeben, fasst die
Speicher-Engine beim Löschen Indexzweige nicht zusammen.
Dies kann bestimmte Arten von Löschvorgängen
beschleunigen.
Das Schlüsselwort IGNORE
bewirkt, dass
MySQL alle Fehler während des Vorgangs der
Datensatzlöschung ignoriert. (Fehler, die bei der Analyse
auftreten, werden allerdings wie gewöhnlich verarbeitet.)
Fehler, die aufgrund der Verwendung von
OPTION
ignoriert werden, werden als
Warnungen zurückgegeben.
Die Geschwindigkeit von Löschoperationen kann auch von den
Faktoren beeinflusst werden, die in
Abschnitt 7.2.18, „Geschwindigkeit von DELETE
-Anfragen“, beschrieben werden.
Bei MyISAM
-Tabellen werden gelöschte
Datensätze zu einer verknüpften Liste hinzugefügt.
Nachfolgende INSERT
-Operationen verwenden die
alten Datensatzpositionen neu. Um ungenutzten Speicher wieder
freizugeben und die Dateigrößen zu verringern, verwenden Sie
die OPTIMIZE TABLE
-Anweisung oder das
Hilfsprogramm myisamchk zur Reorganisierung
der Tabellen. OPTIMIZE TABLE
ist einfacher,
myisamchk hingegen schneller. Siehe auch
Abschnitt 13.5.2.5, „OPTIMIZE TABLE
“, und
Abschnitt 8.2, „myisamchk — Hilfsprogramm für die Tabellenwartung von MyISAM“.
Der Modifizierer QUICK
bestimmt, ob
Indexzweige bei Löschoperationen zusammengefasst werden.
DELETE QUICK
ist am nützlichsten bei
Anwendungen, bei denen Indexwerte für gelöschte Datensätze
durch ähnliche Indexwerte von später eingefügten Datensätzen
ersetzt werden. In diesem Fall werden die von den gelöschten
Werten zurückgelassenen Löcher wiederverwendet.
DELETE QUICK
ist hingegen nicht nützlich,
wenn gelöschte Werte nicht aufgefüllte Indexblöcke zur Folge
haben, die einen Bereich von Indexwerten umfassen, bei denen
neue Einfügeoperationen auftreten. In diesem Fall kann die
Verwendung von QUICK
zur Verschwendung von
Speicher im Index führen, da dieser Speicher nicht mehr
freigegeben wird. Hier ein Beispiel für ein solches Szenario:
Erstellen Sie eine Tabelle, die eine indizierte
AUTO_INCREMENT
-Spalte enthält.
Fügen Sie viele Datensätze in diese Tabelle ein. Jede Einfügeoperation führt dazu, dass ein Indexwert am Ende des Indexes eingefügt wird.
Löschen Sie mit DELETE QUICK
einen Block
mit Datensätzen vorne im Spaltenbereich.
In diesem Szenario werden die Indexblöcke, die mit den
gelöschten Indexwerten verknüpft sind, nicht aufgefüllt, aber
aufgrund der Verwendung von QUICK
auch nicht
mit anderen Indexblöcken zusammengefasst. Sie bleiben also
unaufgefüllt, wenn weitere Einfügeoperationen auftreten, weil
die neuen Datensätze keine Indexwerte im gelöschten Bereich
haben. Außerdem bleiben sie auch dann unaufgefüllt, wenn Sie
später DELETE
ohne QUICK
verwenden, sofern nicht zufällig einige der gelöschten
Indexwerte in Indexblöcken innerhalb oder neben den nicht
aufgefüllten Blöcken liegen. Um ungenutzten Indexspeicher
unter diesen Umständen wieder freizugeben, verwenden Sie
OPTIMIZE TABLE
.
Wenn Sie viele Datensätze aus einer Tabelle zu löschen
beabsichtigen, kann DELETE QUICK
gefolgt von
OPTIMIZE TABLE
die schnellere Lösung sein.
Hierbei wird der Index neu erstellt, statt zahlreiche
Zusammenfassungsoperationen für Indexblöcke auszuführen.
Die MySQL-spezifische Option LIMIT
für
row_count
DELETE
nennt dem Server die maximale Anzahl
Datensätze, die gelöscht werden, bevor die Kontrolle an den
Client zurückgegeben wird. Hiermit können Sie gewährleisten,
dass eine gegebene DELETE
-Anweisung nicht zu
viel Zeit in Anspruch nimmt. Sie können die
DELETE
-Anweisung dann einfach wiederholen,
bis die Gesamtzahl betroffener Datensätze kleiner ist als der
LIMIT
-Wert.
Wenn die DELETE
-Anweisung eine ORDER
BY
-Klausel enthält, werden die Datensätze in der in
der Klausel angegebenen Reihenfolge gelöscht. Dies ist nur in
Verbindung mit LIMIT
wirklich nützlich. Die
folgende Anweisung beispielsweise findet Datensätze, die der
WHERE
-Klausel entsprechen, sortiert sie nach
timestamp_column
und löscht den ersten
(d. h. ältesten) Datensatz:
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
Sie können in einer DELETE
-Anweisung mehrere
Tabellen angeben, aus denen je nach Bedingung der
WHERE
-Klausel Datensätze gelöscht werden.
Allerdings können Sie ORDER BY
oder
LIMIT
nicht in einer
DELETE
-Anweisung für mehrere Tabellen
verwenden. Die Klausel
table_references
listet die Tabellen
auf, die im Join berücksichtigt werden. Die Syntax ist in
Abschnitt 13.2.7.1, „JOIN
“, beschrieben.
Bei der ersten Mehrtabellensyntax werden nur passende
Datensätze aus den Tabellen gelöscht, die vor der
FROM
-Klausel aufgelistet sind. Bei der
zweiten Mehrtabellensyntax werden nur passende Datensätze aus
den Tabellen gelöscht, die in der
FROM
-Klausel (vor der
USING
-Klausel) aufgelistet sind. Die Folge
ist, dass Sie Datensätze aus vielen Tabellen gleichzeitig
löschen und gleichzeitig in weiteren Tabellen nur suchen lassen
können:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
Oder:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
Diese Anweisungen verwenden auf der Suche nach zu löschenden
Datensätzen alle drei Tabellen, aber gelöscht werden passende
Datensätze tatsächlich nur aus den Tabellen
t1
und t2
.
Die obigen Beispiele zeigen innere Joins, die den Kommaoperator
verwenden. DELETE
-Anweisungen für mehrere
Tabellen können jedoch einen beliebigen Join-Typ verwenden, der
für SELECT
-Anweisungen zulässig ist, also
etwa LEFT JOIN
.
Die Syntax erlaubt .*
nach den Tabellennamen,
um die Kompatibilität mit Access zu gewährleisten.
Wenn Sie eine DELETE
-Anweisung für mehrere
Tabellen verwenden, die auch InnoDB
-Tabellen
einbezieht, für die Fremdschlüssel-Constraints vorhanden sind,
dann verarbeitet der MySQL-Optimierer die Tabellen unter
Umständen in einer Reihenfolge, die sich von der ihrer
Parent/Child-Beziehung unterscheidet. In diesem Fall schlägt
die Anweisung fehl, und es wird ein Rollback durchgeführt.
Stattdessen sollten Sie die Löschoperation dann aus nur einer
Tabelle durchführen und sich auf die ON
DELETE
-Funktionalität verlassen, die
InnoDB
bietet, um andere Tabellen
entsprechend zu ändern.
Hinweis: Wenn Sie einen Alias für eine Tabelle angegeben haben, müssen Sie diesen bei der Referenzierung der Tabelle verwenden:
DELETE t1 FROM test AS t1, test2 WHERE ...
Datenbankübergreifende Löschvorgänge werden von Löschvorgängen für mehrere Tabellen unterstützt. In diesem Fall müssen Sie die Tabellen aber ohne Verwendung von Aliasen referenzieren. Zum Beispiel:
DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
Zurzeit können Sie in einer Unterabfrage keine Löschoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.