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; 
SQL DELETE

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.

ARTIKEL TEILEN

Hast du Fragen? Hinterlasse einen Kommentar!