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'


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow