Die SQL DELETE Anweisung löscht Zeilen aus einer Tabelle. Die Verwendung der WHERE-Klausel ermöglicht die gezielte Löschung von Datensätzen, die bestimmten Kriterien entsprechen. Sie ist mit Vorsicht anzuwenden, da gelöschte Daten in der Regel nicht wiederherstellbar sind.
DELETE FROM Tabelle
WHERE Bedingung;
Funktion und Verwendung von SQL DELETE
Der erste Teil des Befehls (DELETE FROM Tabelle) würde alle Einträge aus der Tabelle löschen. Da das selten sinnvoll ist, werden DELETE Befehle meistens mit WHERE-Bedingungen verknüpft, um spezifische Zeilen zu löschen.
DELETE FROM Tabelle
WHERE Bedingung;
Beispiele für SQL DELETE
Löschen einer einzigen Zeile mit SQL DELETE
Das ist ein einfacher Anwendungsfall, in dem man eine bestimmte Zeile anhand seiner eindeutigen ID löschen möchte. Angenommen, wir haben eine Tabelle namens „Kunden“ und wir möchten den Kunden mit der ID 123 löschen.
DELETE FROM Kunden
WHERE id = 123;
Löschen mehrerer Zeilen basierend auf einer Bedingung
In diesem Anwendungsfall löschen wir mehrere Datensätze, die eine bestimmte Bedingung erfüllen. Angenommen, wir haben eine Tabelle „Bestellungen“ und wir möchten alle Bestellungen löschen, die älter als ein Jahr sind.
DELETE FROM Bestellungen
WHERE bestelldatum < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR);
Löschen von Zeilen mit einer JOIN-Bedingung
Dies ist ein komplexerer Anwendungsfall, bei dem man Datensätze aus einer Tabelle löschen möchte, die mit einer anderen Tabelle verknüpft sind. Angenommen, wir haben zwei Tabellen: „Produkte“ und „Kategorien“. Wir möchten alle Produkte löschen, die zur Kategorie „Veraltet“ gehören.
DELETE Produkte
FROM Produkte
INNER JOIN Kategorien ON Produkte.kategorie_id = Kategorien.id
WHERE Kategorien.name = 'Veraltet';
DELETEs mit JOINs zu verbinden, ist eine wichtige Fähigkeit, um sicher Daten zu löschen. Häufig muss man in der Praxis Zeilen aus einer Tabelle löschen, die in einer Weise in einer anderen Tabelle existieren.
Löschen von Zeilen basierend auf Textattributen
Angenommen, du hast eine Tabelle namens „Artikel“ und du möchtest alle Artikel löschen, deren Titel das Wort „Entwurf“ enthält. Das kannst du mit dem LIKE-Operator lösen.
DELETE FROM Artikel
WHERE titel LIKE '%Entwurf%';
Alternativ kannst du auch einen Satz an Daten haben, die du löschen möchtest. Das kannst du mit dem IN-Operator lösen.
DELETE FROM Artikel
WHERE titel IN ('Coca Cola', 'Fanta', 'Sprite');
Alle Zeilen einer Tabelle löschen mit SQL DELETE
Um alle Zeilen deiner Tabelle zu löschen, musst du den DELETE Befehl ohne WHERE Bedingung ausführen:
DELETE FROM Kunden;
SQL DELETE vs SQL TRUNCATE
Das ist aber nicht der sauberste Weg. Eine viel schnellere Option ist der SQL TRUNCATE Anweisung. DELETE löscht jede Zeile einzeln, während TRUNCATE Datenblöcke entfernt. Bei kleinen Tabellen sollte das aber keinen großen Unterschied machen.
Es gibt weitere kleine Unterschiede:
- DELETE gibt die Anzahl der gelöschten Zeilen zurück, während TRUCNATE keine Rückgabewerte hat
- DELETE kann in einer Transaktion via ROLLBACK rückgängig gemacht werden, TRUNCATE nicht
- DELETE aktualisiert Indizes für jede Zeile, TRUNCATE macht das einmal für die ganze Tabelle
Wichtige Überlegungen bei der Verwendung von SQL DELETE
Die Nutzung des SQL DELETE Befehls bringt erhebliche Verantwortung mit sich. Es ist nicht nur ein Werkzeug, sondern eine starke Waffe, die, wenn sie unachtsam verwendet wird, erheblichen Schaden anrichten kann.
Verständnis der Gefahren beim Löschen von Datensätzen
Ein SQL DELETE Befehl ohne WHERE-Klausel löscht alle Zeilen in der angegebenen Tabelle. Das kann katastrophale Folgen haben, wenn es unbeabsichtigt passiert. Selbst mit einer WHERE-Klausel kann der Befehl, wenn er falsch formuliert wird, mehr Daten löschen, als beabsichtigt war. Es ist daher von größter Wichtigkeit, jeden SQL DELETE Befehl sorgfältig zu überprüfen, bevor er ausgeführt wird.
Wichtigkeit von Backups und Wiederherstellungspunkten
Vor der Ausführung eines SQL DELETE Befehls sollte immer sichergestellt werden, dass eine aktuelle Sicherung (Backup) der Datenbank existiert. Im Fall eines unbeabsichtigten Löschens von Daten ermöglicht ein Backup die Wiederherstellung der Daten auf den Zustand vor der Löschung.
Ein Wiederherstellungspunkt hingegen erlaubt das „Zurückspulen“ der Datenbank auf einen früheren Zustand, was insbesondere bei umfangreichen Änderungen hilfreich sein kann.
Wenn es schnell und unsauber gehen muss, kannst du auch eine temporäre Kopie deiner Tabelle erstellen und wieder zurückspulen:
# Kopie der Tabelle erstellen mit dem Zeitstempel 01.01.2023 20:15 Uhr
CREATE TABLE kopie_deiner_tabelle_01_01_2023_20_15
AS (SELECT * FROM deine_tabelle);
# Fehlerhafte DELETE Bedingung
DELETE FROM deine_tabelle WHERE bedingung = 'ups_falsche_bedingung';
# Zurückspulen
INSERT INTO deine_tabelle
(SELECT * FROM kopie_deiner_tabelle_01_01_2023_20_15
WHERE id NOT IN (SELECT id FROM deine_tabelle));
Löschen von Zeilen basierend auf Textattributen
Um das Risiko unbeabsichtigter Datenlöschungen zu minimieren, sollten Zugriffsrechte in der Datenbank sorgfältig verwaltet werden. Nur Benutzer mit den entsprechenden Berechtigungen sollten in der Lage sein, SQL DELETE Befehle auszuführen.
Außerdem sollte jeder Löschvorgang protokolliert werden, um im Fall von Problemen nachvollziehen zu können, was passiert ist.
Best Practices und Tipps für die Verwendung von SQL DELETE
DELETE testen mit SELECT
Bevor du deinen DELETE Befehl ausführst, „übersetze“ ihn einmal in einen SELECT Befehl, damit du herausfindest, welche Daten gelöscht werden. Ersetze DELETE FROM mit SELECT * FROM, damit dir alle Daten gezeigt werden, die gelöscht werden würden:
DELETE FROM Kundenbewertungen
WHERE sterne = 1;
# Vorher überprüfen:
SELECT * FROM Kundenbewertungen
WHERE sterne = 1;
Erstelle immer eine Sicherheitskopie
Ob Backup oder Wiederherstellungspunkt, stell sicher, dass du zu den alten Daten zurückspringen kannst, wenn etwas schiefgeht. Egal, wie sicher du dir bist, dass deine Abfrage richtig ist.
Nutze Transaktionen
Verwende Transaktionen, um DELETE-Operationen in einer atomaren Einheit zu gruppieren. Beginne eine Transaktion mit dem Befehl „BEGIN TRANSACTION“ und bestätige die Änderungen mit „COMMIT“, oder breche die Transaktion bei Problemen mit „ROLLBACK“ ab. Dadurch wird sichergestellt, dass die Löschvorgänge konsistent und wiederherstellbar sind.
BEGIN TRANSACTION;
DELETE FROM deine_tabelle
WHERE bedingung;
# Option A
COMMIT;
# Option B
ROLLBACK;
Arbeite vorher in einer Testumgebung
Bevor du DELETE in der Production-Umgebung verwendest, teste es zunächst in einer separaten Testumgebung. Dadurch kannst du potenzielle Auswirkungen auf andere Daten oder Anwendungen erkennen und sicherstellen, dass der DELETE-Befehl das gewünschte Ergebnis liefert.