MySQL
LÖSCHEN
Suche…
Syntax
- DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM Tabelle [WHERE-Bedingungen] [ORDER BY-Ausdruck [ASC | DESC]] [LIMIT number_rows]; /// Syntax zum Löschen von Zeilen aus einer Tabelle
Parameter
Parameter | Einzelheiten |
---|---|
NIEDRIGE PRIORITÄT | Wenn LOW_PRIORITY ist, wird das Löschen so lange verzögert, bis keine Prozesse aus der Tabelle gelesen werden |
IGNORIEREN | Wenn IGNORE wird, werden alle während des Löschvorgangs IGNORE Fehler ignoriert |
Tabelle | Die Tabelle, aus der Sie Datensätze löschen möchten |
WHERE Bedingungen | Die Bedingungen, die erfüllt sein müssen, damit die Datensätze gelöscht werden. Wenn keine Bedingungen angegeben werden, werden alle Datensätze aus der Tabelle gelöscht |
ORDER BY-Ausdruck | Wenn ORDER BY ist, werden Datensätze in der angegebenen Reihenfolge gelöscht |
GRENZE | Er steuert die maximale Anzahl von Datensätzen, die aus der Tabelle gelöscht werden sollen. number_rows werden gelöscht. |
Mit Where-Klausel löschen
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
Dadurch werden alle Zeilen aus der Tabelle field_one
bei denen der Inhalt von field_one
für diese Zeile mit 'value_one' übereinstimmt.
Die WHERE
Klausel funktioniert genauso wie eine select, also können Dinge wie >
, <
, <>
oder LIKE
verwendet werden.
Hinweis: In der Löschabfrage müssen bedingte Klauseln (WHERE, LIKE) verwendet werden. Wenn Sie keine Bedingungsklauseln verwenden, werden alle Daten aus dieser Tabelle gelöscht.
Löschen Sie alle Zeilen aus einer Tabelle
DELETE FROM table_name ;
Dadurch werden alle Zeilen und alle Zeilen aus der Tabelle gelöscht. Es ist das grundlegendste Beispiel für die Syntax. Es zeigt auch, dass DELETE
Anweisungen wirklich mit besonderer Vorsicht verwendet werden sollten, da sie eine Tabelle leeren können, wenn die WHERE
Klausel weggelassen wird.
LIMITing löscht
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
Dies funktioniert auf dieselbe Weise wie das Beispiel 'Delete with Where', aber der Löschvorgang wird abgebrochen, sobald die begrenzte Anzahl von Zeilen entfernt wurde.
Wenn Sie Zeilen zum Löschen einschränken, beachten Sie, dass die erste Zeile gelöscht wird, die den Kriterien entspricht. Es ist möglicherweise nicht das, was Sie erwarten würden, da die Ergebnisse unsortiert werden können, wenn sie nicht explizit angeordnet werden.
Multi-Table löscht
Die DELETE
Anweisung von MySQL kann das JOIN
Konstrukt verwenden, wodurch auch angegeben werden kann, aus welchen Tabellen gelöscht werden soll. Dies ist nützlich, um verschachtelte Abfragen zu vermeiden. In Anbetracht des Schemas:
create table people
( id int primary key,
name varchar(100) not null,
gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');
create table pets
( id int auto_increment primary key,
ownerId int not null,
name varchar(100) not null,
color varchar(100) not null
);
insert pets(ownerId,name,color) values
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
Ich würde | Name | Geschlecht |
---|---|---|
1 | Kathy | f |
2 | John | m |
3 | Paul | m |
4 | Kim | f |
Ich würde | ownerId | Name | Farbe |
---|---|---|---|
1 | 1 | Rover | Beige |
2 | 2 | Bläschen | lila |
4 | 1 | Rover2 | Weiß |
Wenn wir Pauls Haustiere entfernen möchten, die Aussage
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
kann umgeschrieben werden als:
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 Zeile gelöscht
Spot wird aus Pets gelöscht
p1
und p2
sind Aliasnamen für die Tabellennamen, besonders nützlich für lange Tabellennamen und für eine gute Lesbarkeit.
So entfernen Sie sowohl die Person als auch das Haustier:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 Zeilen gelöscht
Spot wird aus Pets gelöscht
Paul wird aus den Leuten gestrichen
fremde Schlüssel
Wenn die DELETE-Anweisung Tabellen mit einer foreing-Schlüsseleinschränkung enthält, kann das Optimierungsprogramm die Tabellen in einer Reihenfolge verarbeiten, die der Beziehung nicht folgt. Hinzufügen eines Fremdschlüssels zur Definition von pets
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
Die Engine versucht möglicherweise, die Einträge von people
vor pets
zu löschen, wodurch der folgende Fehler verursacht wird:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))
Die Lösung in diesem Fall besteht darin, die Zeile von people
zu löschen und sich auf die ON DELETE
Funktionen von InnoDB
verlassen, um die Löschung zu verbreiten:
DELETE FROM people
WHERE name = 'Paul';
2 Zeilen gelöscht
Paul wird aus den Leuten gestrichen
Spot wird in der Kaskade von Pets gelöscht
Eine andere Lösung ist die vorübergehende Deaktivierung der Überprüfung der Schlüssel.
SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;
Grundlegendes löschen
DELETE FROM `myTable` WHERE `someColumn` = 'something'
Die WHERE
Klausel ist optional, aber ohne sie werden alle Zeilen gelöscht.
LÖSCHEN vs TRUNCATE
TRUNCATE tableName;
Dadurch werden alle Daten gelöscht und der AUTO_INCREMENT
Index zurückgesetzt. Es ist viel schneller als DELETE FROM tableName
in einem großen Datensatz. Dies kann während der Entwicklung / beim Testen sehr nützlich sein.
Wenn Sie eine Tabelle abschneiden, löscht der SQL Server die Daten nicht, löscht die Tabelle und erstellt sie neu. Dadurch werden die Seiten freigegeben, sodass die abgeschnittenen Daten vor den überschriebenen Seiten wiederhergestellt werden können. (Der Speicherplatz kann für innodb_file_per_table=OFF
nicht sofort wieder hergestellt werden.)
Multi-Table LÖSCHEN
In MySQL kann angegeben werden, aus welcher Tabelle die übereinstimmenden Zeilen gelöscht werden müssen
-- remove only the employees
DELETE e
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove employees and department
DELETE e, d
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove from all tables (in this case same as previous)
DELETE
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'