Daten löschen: der DELETE-Operator
Hin und wieder kommt die Aufgabe, Datensätze aus einer Tabelle zu löschen. Dafür gibt es in SQL die Operatoren DELETE und TRUNCATE, wobei der erste die universellere und sicherere Variante ist.
Allgemeine Struktur einer DELETE-Query
MySQL 8.1DELETE FROM tabellen_name [WHERE auswahl_bedingung];
Fehlt die Auswahlbedingung WHERE, werden alle Datensätze der angegebenen Tabelle gelöscht.
Die gleiche Operation (alle Datensätze löschen) lässt sich auch über TRUNCATE erledigen. Dieser Operator löscht die Tabelle und legt sie neu an – das geht deutlich schneller als das Löschen aller Datensätze nacheinander (wie bei DELETE), insbesondere bei großen Tabellen.
Allgemeine Struktur einer TRUNCATE-Query
MySQL 8.1TRUNCATE TABLE tabellen_name;
Der Query-Optimierer von MySQL nutzt automatisch TRUNCATE, wenn die DELETE-Anweisung weder eine WHERE-Bedingung noch ein LIMIT enthält.
TRUNCATE hat allerdings einige Besonderheiten:
- Trigger werden nicht ausgelöst, insbesondere keine Delete-Trigger.
- Löscht alle Zeilen, ohne das Löschen einzelner Zeilen im Transaktionslog zu protokollieren.
- Setzt den ID-Zähler auf den Startwert zurück.
- Zur Nutzung sind Schreibrechte auf der Tabelle nötig.
- Trigger werden nicht ausgelöst, insbesondere keine Delete-Trigger.
- Löscht alle Zeilen, ohne das Löschen einzelner Zeilen im Transaktionslog zu protokollieren.
- Kann den ID-Zähler zurücksetzen, wenn die Option RESTART IDENTITY verwendet wird (Standard ist CONTINUE IDENTITY, der Zähler bleibt erhalten).
- Zur Nutzung sind Schreibrechte auf der Tabelle nötig.
Datensätze in Multi-Table-Queries löschen
Verwendet eine DELETE-Query einen JOIN, musst du angeben, aus welchen Tabellen Datensätze gelöscht werden sollen.
MySQL 8.1DELETE tabellen_name_1 FROM tabellen_name_1 JOIN tabellen_name_2 ON tabellen_name_1.feld = tabellen_name_2.feld [WHERE auswahl_bedingung];
MySQL 8.1DELETE FROM tabellen_name_1 USING tabellen_name_2 WHERE tabellen_name_1.feld = tabellen_name_2.feld [AND auswahl_bedingung];
Angenommen, wir wollen alle Reservierungen für Unterkünfte ohne Küche löschen. Die Query sieht dann so aus:
MySQL 8.1DELETE Reservations FROM Reservations JOIN Rooms ON Reservations.room_id = Rooms.id WHERE Rooms.has_kitchen = false;
MySQL 8.1DELETE FROM Reservations USING Rooms WHERE Reservations.room_id = Rooms.id AND Rooms.has_kitchen = false;
Wenn wir zusätzlich zur Reservierung auch die Unterkunft selbst löschen wollten, sähe die Query so aus:
MySQL 8.1DELETE Reservations, Rooms FROM Reservations JOIN Rooms ON Reservations.room_id = Rooms.id WHERE Rooms.has_kitchen = false;
In PostgreSQL nutzt du zum gleichzeitigen Löschen aus mehreren Tabellen separate DELETE-Queries oder eine Transaktion:
MySQL 8.1BEGIN; DELETE FROM Reservations USING Rooms WHERE Reservations.room_id = Rooms.id AND Rooms.has_kitchen = false; DELETE FROM Rooms WHERE Rooms.has_kitchen = false; COMMIT;