Löschen ist nicht einfach nur eine Funktion, das ist schon fast eine Kunst! Wichtig ist, genau das zu löschen, was du willst – und nicht aus Versehen zu viel (versehentlich gelöschte Daten können dich noch lange in deinen Albträumen verfolgen). Heute lernst du, wie man das sauber und nach allen Regeln macht!
Das Löschen von Daten ist der Prozess, eine oder mehrere Zeilen aus einer Tabelle zu entfernen, die nicht mehr zur Business-Logik oder zu den Anforderungen deines Systems passen. Zum Beispiel musst du vielleicht Einträge von Studierenden löschen, die ihr Studium abgeschlossen haben oder, ähm, die Uni-Regeln ziemlich verletzt haben. Oder du willst einfach die Tabelle aufräumen und nur noch aktuelle Infos behalten.
Das Löschen von Daten wird in folgenden Szenarien verwendet:
- Löschen von User-Daten, die nicht mehr aktiv sind.
- Aufräumen von Tabellen mit temporären Einträgen.
- Löschen von doppelten Daten.
- Löschen von veralteten Einträgen nach bestimmter Business-Logik.
Syntax vom DELETE-Befehl
Um Daten zu löschen, benutzen wir den DELETE-Befehl. Hier ist die Grundsyntax:
DELETE FROM tabelle
WHERE bedingung;
Die wichtigsten Bestandteile:
DELETE FROM– das Schlüsselwort, mit dem du angibst, dass du Zeilen aus einer Tabelle löschen willst.- tabelle – der Name der Tabelle, aus der du Daten löschen willst.
WHERE bedingung– die Bedingung, nach der gefiltert wird, welche Zeilen gelöscht werden. Hier kannst du alle möglichen Vergleichsoperatoren, logische Operatoren (AND,OR,NOT) und sogar Subqueries verwenden.
Beispiel: Stell dir vor, wir haben eine Tabelle students und wollen daraus den Studenten mit ID = 5 löschen:
DELETE FROM students
WHERE id = 5;
Dieser Befehl löscht die Zeile aus der Tabelle students, wo die Studenten-ID (Spalte id) 5 ist.
Wichtig: Wenn du vergisst, die WHERE-Bedingung anzugeben, löscht PostgreSQL alle Zeilen aus der Tabelle. So ein Fehler kann richtig übel enden, vor allem in einer produktiven Umgebung.
Alle Zeilen aus einer Tabelle löschen
Wenn du alle Zeilen aus einer Tabelle löschen willst, kannst du den Befehl einfach ohne WHERE-Bedingung schreiben. Zum Beispiel:
DELETE FROM students;
Dieser Befehl löscht alle Einträge aus der Tabelle students. Die Struktur der Tabelle bleibt aber erhalten – sie wird nicht gelöscht, sondern ist einfach leer.
Alternative: TRUNCATE
Um alle Zeilen aus einer Tabelle zu löschen, kannst du auch den TRUNCATE-Befehl verwenden. Der ist schneller als DELETE, weil er das Löschen nicht für jede Zeile einzeln im Transaktions-Log speichert. Beispiel:
TRUNCATE TABLE students;
Unterschiede zwischen DELETE und TRUNCATE:
DELETEschreibt jede Löschung ins Transaktions-Log, sodass du sie bei Bedarf rückgängig machen kannst.TRUNCATEunterstützt keine Bedingungen (WHERE) und loggt das Löschen nicht einzeln, was es schneller, aber weniger flexibel macht.
Wenn du einfach nur die Tabelle leeren willst, ist TRUNCATE super. Wenn du aber nur einen Teil der Daten löschen oder die Möglichkeit zum Rückgängig-machen haben willst, ist DELETE besser.
Daten nach komplexen Bedingungen löschen
Die Bedingungen beim DELETE können nicht nur einfach, sondern auch komplex sein – mit logischen Operatoren (AND, OR, NOT) oder sogar Subqueries. Schauen wir uns ein Beispiel an.
Beispiel 1: Mehrere Einträge löschen Wir löschen alle Studierenden, die älter als 30 sind und die in den letzten 3 Monaten nicht anwesend waren:
DELETE FROM students
WHERE age > 30 AND last_attendance_date < (CURRENT_DATE - INTERVAL '3 months');
Dieser Befehl löscht nur die Studierenden, die beide Bedingungen erfüllen.
Beispiel 2: Löschen mit Subquery
Angenommen, wir haben eine Tabelle failed_students, in der die IDs der Studierenden gespeichert sind, die wegen schlechter Leistungen exmatrikuliert wurden. Wir wollen sie aus der Haupttabelle students löschen:
DELETE FROM students
WHERE id IN (SELECT student_id FROM failed_students);
Hier gibt die Subquery alle Studenten-IDs aus der Tabelle failed_students zurück, und der DELETE-Befehl löscht die entsprechenden Zeilen aus students.
Tipp
Bevor du irgendwas löschst, schreib erst mal ein SELECT, das dir die Daten anzeigt, die du löschen willst. Dann ersetzt du einfach das SELECT durch DELETE – und es werden genau die Zeilen gelöscht, die du gerade noch gesehen hast.
Praktisches Beispiel
Stell dir vor, ein Student mit ID = 7 will die Uni wechseln. Wir löschen alle Daten über ihn aus unserer Tabelle:
DELETE FROM students
WHERE id = 7;
Check die Tabelle nach dem Befehl, um sicherzugehen, dass der Eintrag wirklich weg ist:
SELECT * FROM students WHERE id = 7;
Wenn es keinen Eintrag mit ID = 7 mehr gibt, hat das Löschen geklappt.
Warnungen und typische Fehler
Vergessene WHERE-Klausel
Einer der häufigsten Fehler beim Arbeiten mit DELETE ist das Vergessen der WHERE-Klausel. Das führt dazu, dass alle Zeilen aus der Tabelle gelöscht werden – das kann richtig böse enden. Überprüfe immer deine Befehle, bevor du sie ausführst.
Beispiel für so eine Vergesslichkeit:
DELETE FROM students;
-- Fehler! Alle Studierenden werden gelöscht.
Um solche Fehler zu vermeiden, solltest du vor dem DELETE-Befehl immer die WHERE-Bedingung mit einem SELECT testen. Zum Beispiel:
SELECT * FROM students WHERE id = 5;
Wenn die Ausgabe passt, kannst du DELETE gefahrlos ausführen.
Verknüpfte Daten löschen
Wenn eine Tabelle Foreign Keys (FOREIGN KEY) enthält, kann beim Löschen ein Fehler auftreten. Das passiert, wenn die zu löschende Zeile mit anderen Einträgen verknüpft ist. Zum Beispiel: Wenn ein Student in der Tabelle enrollments für einen Kurs eingetragen ist, lässt PostgreSQL das Löschen aus students nicht zu.
Um das Problem zu lösen, kannst du:
- Cascading Delete
ON DELETE CASCADEbeim Erstellen des Foreign Keys verwenden. - Verknüpfte Einträge manuell löschen, bevor du den Haupteintrag entfernst.
Beispiel für das manuelle Löschen verknüpfter Daten:
-- zuerst löschen wir die Daten über Student 5 aus enrollments
DELETE FROM enrollments
WHERE student_id = 5;
-- dann löschen wir Student 5 selbst
DELETE FROM students
WHERE id = 5;
Löschen mit Transaktionen
Für kritische Lösch-Operationen solltest du Transaktionen verwenden. Damit kannst du Änderungen bei einem Fehler wieder rückgängig machen.
Beispiel für Löschen in einer Transaktion:
BEGIN;
DELETE FROM students
WHERE id = 42;
-- Ergebnis prüfen
SELECT * FROM students WHERE id = 42;
-- Wenn alles passt, Änderungen speichern
COMMIT;
-- Wenn nicht, zurückrollen
-- ROLLBACK;
Mehr zu Transaktionen gibt's in den nächsten Vorlesungen :P
GO TO FULL VERSION