Heim >Datenbank >MySQL-Tutorial >MySQL – Löschsyntax
Syntax für eine einzelne Tabelle:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
Syntax für mehrere Tabellen:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.*] [, tbl_name[.*] ...] FROM table_references [WHERE where_definition]
oder:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*] ...] USING table_references [WHERE where_definition]
Einige Zeilen in tbl_name erfüllen die von where_definition angegebenen Anforderungen Zustand. Mit DELETE werden diese Zeilen gelöscht und die Anzahl der gelöschten Datensätze zurückgegeben.
Wenn Sie eine DELETE-Anweisung ohne WHERE-Klausel schreiben, werden alle Zeilen gelöscht. Wenn Sie die Anzahl der gelöschten Zeilen nicht wissen möchten, gibt es einen schnelleren Weg, nämlich die Verwendung von TRUNCATE TABLE.
Wenn die von Ihnen gelöschte Zeile den Maximalwert für die Spalte AUTO_INCREMENT enthält, wird dieser Wert in der BDB-Tabelle wiederverwendet, jedoch nicht in der MyISAM-Tabelle oder der InnoDB-Tabelle. Wenn Sie DELETE FROM tbl_name (ohne WHERE-Klausel) im AUTOCOMMIT-Modus verwenden, um alle Zeilen in einer Tabelle zu löschen, wird die Reihenfolge für alle Tabellentypen (außer InnoDB und MyISAM) neu angeordnet.
Für MyISAM- und BDB-Tabellen können Sie die sekundäre Spalte AUTO_INCREMENT in einem mehrspaltigen Schlüsselwort angeben. In diesem Fall wird der am Anfang der Sequenz entfernte Wert erneut verwendet, auch für MyISAM-Tabellen.
DELETE-Anweisung unterstützt die folgenden Modifikatoren:
· Wenn Sie LOW_PRIORITY angeben, wird die Ausführung von DELETE verzögert, bis kein anderer Client diese Tabelle liest.
· Wenn Sie bei MyISAM-Tabellen das Schlüsselwort QUICK verwenden, führt die Speicher-Engine die Indexendknoten während des Löschvorgangs nicht zusammen, was einige Arten von Löschvorgängen beschleunigen kann.
· Während des Löschvorgangs von Zeilen bewirkt das Schlüsselwort IGNORE, dass MySQL alle Fehler ignoriert. (Fehler, die während der Analysephase auftreten, werden wie gewohnt behandelt.) Fehler, die aufgrund der Verwendung dieser Option ignoriert werden, werden als Warnungen zurückgegeben.
In MyISAM-Tabellen werden gelöschte Datensätze in einer verknüpften Liste beibehalten und nachfolgende INSERT-Vorgänge verwenden den alten Datensatzspeicherort wieder. Um ungenutzten Speicherplatz wiederzuverwenden und die Dateigröße zu reduzieren, verwenden Sie die Anweisung OPTIMIZE TABLE oder die Anwendung myisamchk, um die Tabelle neu zu organisieren. OPTIMIZE TABLE ist einfacher, aber myisamchk ist schneller.
Der QUICK-Modifikator beeinflusst, ob die Indexendknoten während des Löschvorgangs zusammengeführt werden. DELETE QUICK ist am nützlichsten, wenn der Indexwert für die gelöschte Zeile durch einen ähnlichen Indexwert aus einer später eingefügten Zeile ersetzt wird. In diesem Fall werden die durch die gelöschten Werte entstandenen Lücken wiederverwendet.
Wenn der nicht vollständige Indexblock einen bestimmten Bereich von Indexwerten umfasst, erfolgt eine neue Einfügung. DELETE QUICK hat keine Auswirkung, wenn der gelöschte Wert zu einem unterfüllten Indexblock führt. In diesem Fall kann die Verwendung von QUICK dazu führen, dass Speicherplatz in ungenutzten Indizes verschwendet wird. Das Folgende ist ein Beispiel für diese Situation:
1. Erstellen Sie eine Tabelle, die die indizierte AUTO_INCREMENT-Spalte enthält.
2. Fügen Sie viele Datensätze in die Tabelle ein. Jede Einfügung erzeugt einen Indexwert, der zum oberen Ende des Index hinzugefügt wird.
3. Verwenden Sie DELETE QUICK, um eine Gruppe von Datensätzen am unteren Ende der Spalte zu löschen.
In diesem Fall werden die Indexblöcke, die sich auf die gelöschten Indexwerte beziehen, unterfüllt, aber aufgrund der Verwendung von QUICK werden diese Indexblöcke nicht mit anderen Indexblöcken zusammengeführt. Beim Einfügen neuer Werte bleiben diese Indexblöcke unterfüllt, da die neuen Datensätze keine Indexwerte innerhalb des gelöschten Bereichs enthalten. Selbst wenn Sie später DELETE verwenden, ohne QUICK einzubeziehen, bleiben diese Indexblöcke weiterhin ungefüllt, es sei denn, einige der gelöschten Indexwerte befinden sich zufällig in oder neben diesen ungefüllten Blöcken. Wenn Sie in diesen Fällen ungenutzten Indexspeicherplatz wiederverwenden möchten, verwenden Sie OPTIMIZE TABLE.
Wenn Sie vorhaben, viele Zeilen aus einer Tabelle zu löschen, kann die Verwendung von DELETE QUICK in Verbindung mit OPTIMIZE TABLE die Arbeit beschleunigen. Dadurch wird eine Neuindizierung durchgeführt, anstatt eine große Anzahl von Indexblock-Zusammenführungsvorgängen durchzuführen.
MySQLs einzige LIMIT row_count-Option für DELETE wird verwendet, um dem Server die maximale Anzahl von Zeilen mitzuteilen, die gelöscht werden können, bevor der Steuerbefehl an den Client zurückgegeben wird. Diese Option wird verwendet, um sicherzustellen, dass eine DELETE-Anweisung nicht zu viel Zeit in Anspruch nimmt. Sie können die DELETE-Anweisung einfach wiederholen, bis die Anzahl der relevanten Zeilen kleiner als der LIMIT-Wert ist.
Wenn die DELETE-Anweisung eine ORDER BY-Klausel enthält, werden Zeilen in der in der Klausel angegebenen Reihenfolge gelöscht. Diese Klausel funktioniert nur in Verbindung mit LIMIT. Beispielsweise wird die folgende Klausel verwendet, um Zeilen zu finden, die der WHERE-Klausel entsprechen, timestamp_column zur Klassifizierung zu verwenden und die erste (älteste) Zeile zu löschen:
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
Sie können mehrere DELETE-Anweisungen in einer Tabelle angeben. Löschen Sie Zeilen aus einer oder mehreren Tabellen basierend auf bestimmten Bedingungen in mehreren Tabellen. Allerdings können Sie ORDER BY oder LIMIT nicht in einer DELETE-Anweisung mit mehreren Tabellen verwenden.
Der Abschnitt „table_references“ listet die in der Union enthaltenen Tabellen auf.
Bei der ersten Syntax werden nur die entsprechenden Zeilen in der Tabelle gelöscht, die vor der FROM-Klausel aufgeführt sind. Bei der zweiten Syntax werden nur die entsprechenden Zeilen in der Tabelle gelöscht, die in der FROM-Klausel (vor der USING-Klausel) aufgeführt sind. Die Funktion besteht darin, dass Sie Zeilen in vielen Tabellen gleichzeitig löschen und andere Tabellen zum Suchen verwenden 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;
Bei der Suche nach zu löschenden Zeilen Diese Anweisungen verwenden alle drei Tabellen, löschen jedoch nur die entsprechenden Zeilen aus den Tabellen t1 und t2.
Das obige Beispiel zeigt einen internen Join mit dem Komma-Operator, aber die DELETE-Anweisung für mehrere Tabellen kann alle in der SELECT-Anweisung zulässigen Join-Typen verwenden, z. B. LEFT JOIN.
本语法允许在名称后面加.*,以便与Access相容。
如果您使用的多表DELETE语句包括InnoDB表,并且这些表受外键的限制,则MySQL优化程序会对表进行处理,改变原来的从属关系。在这种情况下,该语句出现错误并返回到前面的步骤。要避免此错误,您应该从单一表中删除,并依靠InnoDB提供的ON DELETE功能,对其它表进行相应的修改。
注释:当引用表名称时,您必须使用别名(如果已给定):
DELETE t1 FROM test AS t1, test2 WHERE ...
进行多表删除时支持跨数据库删除,但是在此情况下,您在引用表时不能使用别名。举例说明:
DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
目前,您不能从一个表中删除,同时又在子查询中从同一个表中选择。