Lerne, wie du mit SQL DELETE Datensätze aus einer Tabelle löschen kannst. Lerne die wichtigsten Syntaxregeln, Sicherheitsabläufe und Optimierungstechniken für den Umgang mit großen Datensätzen.
Daten löschen kann in SQL echt riskant sein. Ein einziger schlecht geschriebener Befehl kann die Beziehungen zwischen Tabellen durcheinanderbringen oder sogar einen ganzen Datensatz löschen.
In diesem Tutorial zeige ich dir, wie die Anweisung „ DELETE “ funktioniert, wie du sie richtig einsetzt und wie du häufige Fehler vermeidest, wie zum Beispiel das Löschen eines ganzen Datensatzes, wie ich gerade erwähnt habe.
Wenn du noch keine Erfahrung mit SQL hast, fang mit unserem Kurs „Einführung in SQL“ an. Wenn du schon ein bisschen Erfahrung hast, kannst du mit dem Kurs „SQL für Fortgeschrittene“ loslegen.
Was macht DELETE in SQL?
Bevor wir uns die Syntax anschauen, solltest du wissen, was die Anweisung „ DELETE “ eigentlich macht. Hier sind die verschiedenen Arten, wie man Daten in SQL löschen kann.
SQL DELETE vs. konzeptionelles Entfernen von Zeilen
Die Anweisung „ DELETE “ löscht eine oder mehrere Zeilen aus einer Tabelle, ohne die Struktur der Tabelle zu verändern. Deshalb bleibt das Schema der Tabelle, das die Spaltennamen, Datentypen, Indizes und Einschränkungen enthält, unverändert. Nach dem Löschen ist die Tabelle immer noch da und kann neue Daten aufnehmen.
Stell dir das so vor, als würdest du Einträge aus einem Hauptbuch löschen, nicht die Seiten rausreißen. Das Schema bleibt gleich; nur die ausgewählten Datensätze werden gelöscht.
SQL DELETE vs. DROP vs. TRUNCATE
Obwohl DELETE, DROP und TRUNCATE alle Daten in irgendeiner Form löschen,haben sieganz unterschiedliche Zwecke. Die folgende Tabelle zeigt, wofür die einzelnen Anweisungen verwendet werden:
Entfernt bestimmte Zeilen (mit der Klausel „ WHERE “)
Entfernt alle Zeilen aus einer Tabelle
Löscht die ganze Tabelle und ihre Daten.
Geschwindigkeit
Langsamer (entfernt Zeile für Zeile)
Schneller (gibt Seiten frei)
Sofort
Umkehrbarkeit
Kann rückgängig gemacht werden
Nicht umkehrbar
Nicht rückgängig machbar.
Tabellenstruktur
Konserviert
Erhalten (und IDs zurücksetzen)
Komplett gelöscht
Grundlegende SQL-DELETE-Syntax
Jetzt, wo du weißt, wie die Anweisung „ DELETE “ funktioniert, schauen wir uns mal ihre Syntax an und wie man sie anwendet.
Bestimmte Zeilen mit WHERE löschen
Die Klausel „ WHERE “ legt den Bereich einer „ DELETE “-Operation fest. Die Klausel „ WHERE “ muss immer dabei sein, weil sie der Datenbank genau sagt, welche Zeilen entfernt werden sollen.
-- Basic DELETE syntaxDELETEFROM table_name
WHERE condition;Bereitgestellt von
Alle Zeilen in einer Tabelle löschen
Wenn du die Klausel „ WHERE “ in der Anweisung „ DELETE “ weglässt, geht SQL davon aus, dass du jede einzelne Zeile in der Tabelle ansprechen möchtest. Wenn du das aus Versehen machst, geht die Datenbank-Engine jeden einzelnen Datensatz durch und löscht ihn. Für jede gelöschte Zeile wird ein Eintrag im Transaktionsprotokoll gemacht. Wenn du Millionen von Zeilen hast, kann das echt langsam sein und deine Logdateien überladen.
Sichere Vorgehensweisen bei SQL DELETE
Da ein „ DELETE “-Vorgang dauerhaft sein kann, helfen dir sichere Löschverfahren dabei, langsamer vorzugehen, deine Absicht zu überprüfen und zu planen, wie du Daten wiederherstellen kannst, falls etwas schiefgeht.
Zeilen vor dem Löschen anzeigen
Bevor du eine „ DELETE “-Anweisung ausführst, solltest du immer mit einer „ SELECT “-Anweisung eine Vorschau der Zeilen anzeigen, die du entfernen willst. Verwende dabei dieselbe „ WHERE “-Bedingung, die du auch in deiner „ DELETE “-Anweisung verwenden willst. Wenn die Anweisung „ SELECT “ zu viele oder falsche Zeilen zurückgibt, kannst du das Problem beheben, bevor es zu Problemen kommt.
2023-01-01Die folgende Abfrage sucht zum Beispiel nach Zeilen mit stornierten Bestellungen vor dem 1. Oktober 2017 und löscht dann mit denselben Filtern diese Datensätze.
-- Step 1: Preview the targetsSELECT*FROM Orders
WHEREStatus='Cancelled'AND OrderDate <'2023-01-01';-- Step 2: Once you've verified the list, convert to DELETEDELETEFROM Orders
WHEREStatus='Cancelled'AND OrderDate <'2023-01-01';Bereitgestellt von
Transaktionen und Rollback nutzen
Wenn du die Operation „ DELETE “ in eine Transaktion einbaust, kannst du einen Befehl ausführen, sehen, wie viele Zeilen davon betroffen waren, und dann entscheiden, ob du die Änderung dauerhaft machen oder komplett rückgängig machen willst. Du kannst dann den „ ROLLBACK “ nutzen, um die Daten wieder in ihren vorherigen Zustand zu bringen.
Die folgende Abfrage löscht vorübergehend die entsprechenden Zeilen und stellt sie dann wieder her, sodass du die Auswirkungen überprüfen kannst, ohne Daten zu verlieren.
BEGINTRANSACTION;DELETEFROM Users
WHERE LastLogin <'2020-01-01';-- Inspect the affected row countROLLBACK;Bereitgestellt von
Dann kannst du die folgende Abfrage nutzen, um Nutzer, die sich zuletzt vor dem 1. Januar 2020 angemeldet haben, endgültig zu löschen.
BEGINTRANSACTION;DELETEFROM Users
WHERE LastLogin <'2020-01-01';-- Confirm deletion of the required rowsCOMMIT;Bereitgestellt von
Beachte aber, dass „ ROLLBACK ” nur möglich ist, wenn du die Transaktion noch nicht bestätigt hast.
SQL DELETE mit Joins und Unterabfragen
In echten Datenbanken sind Daten selten für sich allein. Meistens musst du Zeilen löschen, die auf Werten aus anderen Tabellen, abgelaufenen Konten, verwaisten Datensätzen oder nicht mehr zutreffenden zugehörigen Entitäten basieren.
Löschen von Zeilen basierend auf einer anderen Tabelle
Unterabfragen sind die beste und am weitesten verbreitete Methode, um Zeilen basierend auf einer anderen Tabelle zu löschen. Sie funktionieren mit fast allen SQL-Versionen. Die folgende Abfrage löscht zum Beispiel inaktive Benutzer aus der Tabelle „ Users “, deren Konten in der Tabelle „ Accounts “ deaktiviert wurden.
-- Delete users whose accounts have been deactivatedDELETEFROM Users
WHERE AccountId IN(SELECT AccountId
FROM Accounts
WHEREStatus='DEACTIVATED');Bereitgestellt von
Du kannst Joins auch zum Löschen von Zeilen in einer Datenbank verwenden, aber die Syntax ist je nach Datenbank unterschiedlich, wie wir im nächsten Abschnitt sehen werden.
Datenbankspezifische DELETE-Syntax
Auch wenn die Idee hinter der Anweisung „ DELETE “ in SQL dieselbe ist, haben verschiedene Datenbanken unterschiedliche Syntax, wenn man „ JOIN “ benutzt, um Zeilen aus einer Tabelle basierend auf einer anderen zu löschen.
SQL Server fügt die Zieltabelle nach der Anweisung „ DELETE “ ein und fügt dann „ FROM “ hinzu. Im folgenden Beispiel gibt der Alias nach „ DELETE “ (u) an, welche Tabelle gelöscht wird.
-- SQL Server: Delete users linked to deactivated accountsDELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status='DEACTIVATED';Bereitgestellt von
In PostgreSQL verhält sich das „ USING ” wie ein „ JOIN ”. Nur die Zeilen aus der Zieltabelle (Users) werden gelöscht.
-- PostgreSQL: Delete users linked to deactivated accountsDELETEFROM Users
USING Accounts
WHERE Users.AccountId = Accounts.AccountId
AND Accounts.Status='DEACTIVATED';Bereitgestellt von
MySQL lässt das Löschen mehrerer Tabellen zu, verlangt aber, dass die Tabellen ausdrücklich benannt werden. Du musst die zu löschende Tabelle vor der Klausel „ FROM “ platzieren.
-- MySQL: Delete users linked to deactivated accountsDELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status='DEACTIVATED';Bereitgestellt von
Ich empfehle dir , unseren Kurs „Joining Data in SQL”zu machen , umdie verschiedenen Arten von Joins in SQL kennenzulernenund zu lernen, wie man mit verschiedenen verwandten Tabellen in der Datenbank arbeitet.
SQL DELETE und referenzielle Integrität
Wie wir jetzt wissen, gibt's Tabellen in relationalen Datenbanken fast nie alleine. Sie sind oft über Fremdschlüssel miteinander verbunden. Wegen dieser Verknüpfungen kann das Löschen einer Zeile in einer Tabelle ungewollte Folgen haben.
Fremdschlüssel und Einschränkungsfehler
Wenn eine Tabelleüber einen Fremdschlüsselreferenziert wird, legt die Datenbanken fest, was passiert, wenn du versuchst, eine übergeordnete Zeile zu löschen. Standardmäßig verhindern die meisten Datenbanken das Löschen, wenn in einer untergeordneten Tabelle noch zugehörige Zeilen vorhanden sind.
Wenn du zum Beispiel eine Tabelle „ Orders ” hast, die auf die Tabelle „ Customers ” verweist, wird das Löschen eines Kunden, der noch Bestellungen hat, mit einem Constraint-Fehler fehlschlagen. Das verhindert, dass die Datenbank verwaisten Datensätze enthält, die keinen gültigen übergeordneten Datensatz mehr haben.
Kaskadierende Löschungen
Wenn du zugehörige Daten automatisch löschen willst, musst du eine Kaskadenregel festlegen, die der Datenbank sagt, wie sie mit den zugehörigen Daten umgehen soll. Die Methode „ ON DELETE CASCADE “ sagt der Datenbank, dass sie automatisch die zugehörigen untergeordneten Zeilen löschen soll, wenn eine übergeordnete Zeile entfernt wird.
Die folgende Abfrage sagt der Datenbank zum Beispiel, dass sie automatisch alle Zeilen in der Tabelle „ Orders ” löschen soll, die auf einen Kunden verweisen, wenn dieser Kunde aus der Tabelle „ Customers ” gelöscht wird.
-- Parent tableCREATETABLE Customers (
CustomerId INTPRIMARYKEY,
Name VARCHAR(100));-- Child table with a cascading foreign keyCREATETABLE Orders (
OrderId INTPRIMARYKEY,
CustomerId INT,
OrderDate DATE,CONSTRAINT fk_orders_customers
FOREIGNKEY(CustomerId)REFERENCES Customers(CustomerId)ONDELETECASCADE);Bereitgestellt von
Der Vorteil von diesem Ansatz ist, dass die Datenbank sauber bleibt, ohne dass mehrere manuelle ` DELETE `-Anweisungen nötig sind. Du solltest die Anweisung aber vorsichtig einsetzen, weil ein einzelner Löschvorgang eine Kettenreaktion über mehrere Tabellen auslösen und viel mehr Daten als erwartet löschen kann. Du könntest zum Beispiel eine Zeile in der Tabelle „ Departments “ löschen und dabei aus Versehen 500 Zeilen in der Tabelle „ Employees “ wegschmeißen.
Leistungsaspekte beim Löschen von Daten
Wenn du die Anweisung „ DELETE “ benutzt, wirst du merken, dass das Löschen einiger Zeilen sofort geht, aber langsam ist, wenn du Millionen von Zeilen hast. Beachte die folgenden bewährten Methoden, um Datensätze sicher zu löschen:
DELETE vs. TRUNCATE für große Tabellen
Wie wir schon gesehen haben, löschen sowohl DELETE als auch TRUNCATE Datensätze auf folgende Weise:
DELETE: Es geht jede Zeile durch, schaut, ob sie den Kriterien entspricht, entfernt sie und schreibt die Änderung ins Transaktionsprotokoll. Das braucht viele Ressourcen und ist bei riesigen Datensätzen echt langsam. Es ermöglicht das Filtern mit einer „ WHERE “-Klausel und unterstützt Rollbacks.
TRUNCATE: Löscht alle Zeilen auf einmale mit minimaler Protokollierung. Es ist deutlich schneller, kann aber nicht gefiltert werden, lässt sich normalerweise nicht rückgängig machen und wird durch Fremdschlüsselbeschränkungen blockiert.
Massenlöschungen und lang andauernde Vorgänge
Wenn du Millionen von Zeilen in einer einzigen Anweisung löschst, kann das deine ganze Anwendung ziemlich verlangsamen und sogar deine Datenbank zum Absturz bringen, wenn du das nicht richtig machst. Um dieses Risiko zu verringern, solltest du große Datensätze immer in mehreren Schritten löschen.
Beim Batch-Löschen werden nur ein paar Tausend Zeilen auf einmal gelöscht, also nicht so viele auf einmal. Dadurch bleibt die Datenbank reaktionsschnell und der Fortschritt lässt sich leicht überwachen. Wenn was schiefgeht, kannst du den Vorgang stoppen, ohne eine riesige Transaktion rückgängig machen zu müssen.
Häufige Fehler bei SQL DELETE
Hier sind die häufigsten Fehler, auf die du achten solltest, wenn du die DELETE-Anweisung zum Entfernen von Zeilen in deinen Tabellen verwendest:
Die WHERE-Klausel vergessen
Das Vergessen der „ WHERE “-Klausel ist der häufigste Fehler bei der Verwendung von „ DELETE “. Ohne sie löscht die Anweisung jede Zeile in der Tabelle. Stell immer sicher, dass du die Klausel „ WHERE “ benutzt, um die zu löschenden Zeilen anzugeben. Als Vorsichtsmaßnahme solltest du die zuvor besprochene Gewohnheit „ SELECT-before-DELETE “ anwenden, um die Zeilen vor dem Löschen anzusehen.
Angenommen, DELETE ist rückgängig machbar
Ein weiteres häufiges Missverständnis ist, dass gelöschte Daten immer wiederhergestellt werden können. Beachte, dass die Anweisung „ DELETE “ standardmäßig die Daten nach dem Commit als physisch von der Festplatte entfernt markiert, es sei denn, du hast Backups, Replikate oder Audit-Protokolle eingerichtet.
Du kannst den Befehl „ DELETE “ nur rückgängig machen, wenn:
Es wird innerhalb einer Transaktion gemacht.
Die Transaktion wurde noch nicht bestätigt.
Die Datenbank und die Speicher-Engine unterstützen Rollbacks.
SQL DELETE in Produktionsumgebungen
In Produktionssystemen geht es beim Befehl „ DELETE “ mehr um Kontrolle, Transparenz und Verantwortlichkeit als um die Syntax. In solchen Umgebungen geht's nicht nur darum, Daten zu löschen, sondern das sicher und bewusst zu machen.
Zugriffskontrolle und Berechtigungen
Im Arbeitsalltag sollte das Löschen von Daten nach dem Prinzip der geringsten Rechte gehen. Nicht jeder Benutzer oder jedes Anwendungsdienstkonto sollte über Berechtigungen für „ DELETE “ verfügen.
Den meisten „Nur-Lese“-Benutzern oder Reporting-Tools sollte dieses Recht ausdrücklich verweigert werden. Die meisten Firmen brauchen normalerweise eine „Peer Review“, bei der jemand anderes die „ WHERE “-Klausel eines manuellen Löschskripts checkt, bevor es in der Produktion läuft.
Ich schlage vor, du probierst den Lernpfad „SQL Server für Datenbankadministratoren” aus, wenndu regelmäßig im Rahmen deiner Arbeit Datenbanken entwirfst oder wartest.
Prüfung und vorläufiges Löschen
Viele Produktionssysteme vermeiden endgültige Löschungen wegen der damit verbundenen Risiken. Stattdessen nutzen sie Soft Deletes, bei denen eine Zeile als gelöscht markiert wird. Du kannst zum Beispiel einen Zeitstempel „ deleted_at “ oder ein Flag „ is_deleted “ verwenden, anstatt einen Datensatz physisch zu löschen.
Soft Deletes machen die Wiederherstellung einfach, helfen bei der Überwachung und speichern alte Daten für Fehlerbehebung und Compliance.
Fazit
Das Wichtigste ist: Definiere immer eine klare „ WHERE “-Klausel, schau dir die betroffenen Zeilen mit „ SELECT “ an und nutze Transaktionen, wann immer es geht. In Produktionssystemen sollte jede Löschung bewusst und nachprüfbar sein. Behandle „ DELETE ” genauso sorgfältig wie eine Schemaänderung oder eine Bereitstellung, dann bleibt es ein nützliches Tool und wird nicht zu einem teuren Fehler.
Ich empfehle dir, unserenKurs „Datenbankdesign“zu machen. Da lernst du, wie man Datenbanken erstellt und verwaltet und das passende DBMS für deine Bedürfnisse auswählt. Ich empfehle dir auch, unserenLernpfad als Associate Data Engineer in SQL auszuprobieren,um die Grundlagen des Data Engineering und Data Warehousing zu lernen.
Gewinne Vertrauen in die OLS-Regression, indem du ihre theoretischen Grundlagen beherrschst. Erforsche, wie du einfache Implementierungen in Excel, R und Python durchführst.
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Lerne, wie du Python-Listen mit Techniken wie Slicing, List Comprehensions und itertools aufteilen kannst. Finde heraus, wann du welche Methode für die beste Datenverarbeitung nutzen solltest.
Daten löschen kann in SQL echt riskant sein. Ein einziger schlecht geschriebener Befehl kann die Beziehungen zwischen Tabellen durcheinanderbringen oder sogar einen ganzen Datensatz löschen.
In diesem Tutorial zeige ich dir, wie die Anweisung „
DELETE“ funktioniert, wie du sie richtig einsetzt und wie du häufige Fehler vermeidest, wie zum Beispiel das Löschen eines ganzen Datensatzes, wie ich gerade erwähnt habe.Wenn du noch keine Erfahrung mit SQL hast, fang mit unserem Kurs „Einführung in SQL“ an. Wenn du schon ein bisschen Erfahrung hast, kannst du mit dem Kurs „SQL für Fortgeschrittene“ loslegen.
Was macht DELETE in SQL?
Bevor wir uns die Syntax anschauen, solltest du wissen, was die Anweisung „
DELETE“ eigentlich macht. Hier sind die verschiedenen Arten, wie man Daten in SQL löschen kann.SQL DELETE vs. konzeptionelles Entfernen von Zeilen
Die Anweisung „
DELETE“ löscht eine oder mehrere Zeilen aus einer Tabelle, ohne die Struktur der Tabelle zu verändern. Deshalb bleibt das Schema der Tabelle, das die Spaltennamen, Datentypen, Indizes und Einschränkungen enthält, unverändert. Nach dem Löschen ist die Tabelle immer noch da und kann neue Daten aufnehmen.Stell dir das so vor, als würdest du Einträge aus einem Hauptbuch löschen, nicht die Seiten rausreißen. Das Schema bleibt gleich; nur die ausgewählten Datensätze werden gelöscht.
SQL DELETE vs. DROP vs. TRUNCATE
Obwohl
DELETE,DROPundTRUNCATEalle Daten in irgendeiner Form löschen,haben sieganz unterschiedliche Zwecke. Die folgende Tabelle zeigt, wofür die einzelnen Anweisungen verwendet werden:Funktionen
LÖSCHEN
TRUNCATE
DROP
Befehlstyp
DML (Sprache der Datenbearbeitung)
DDL (Datenbeschreibungssprache)
DDL (Datenbeschreibungssprache)
Umfang
Entfernt bestimmte Zeilen (mit der Klausel „
WHERE“)Entfernt alle Zeilen aus einer Tabelle
Löscht die ganze Tabelle und ihre Daten.
Geschwindigkeit
Langsamer (entfernt Zeile für Zeile)
Schneller (gibt Seiten frei)
Sofort
Umkehrbarkeit
Kann rückgängig gemacht werden
Nicht umkehrbar
Nicht rückgängig machbar.
Tabellenstruktur
Konserviert
Erhalten (und IDs zurücksetzen)
Komplett gelöscht
Grundlegende SQL-DELETE-Syntax
Jetzt, wo du weißt, wie die Anweisung „
DELETE“ funktioniert, schauen wir uns mal ihre Syntax an und wie man sie anwendet.Bestimmte Zeilen mit WHERE löschen
Die Klausel „
WHERE“ legt den Bereich einer „DELETE“-Operation fest. Die Klausel „WHERE“ muss immer dabei sein, weil sie der Datenbank genau sagt, welche Zeilen entfernt werden sollen.Alle Zeilen in einer Tabelle löschen
Wenn du die Klausel „
WHERE“ in der Anweisung „DELETE“ weglässt, geht SQL davon aus, dass du jede einzelne Zeile in der Tabelle ansprechen möchtest. Wenn du das aus Versehen machst, geht die Datenbank-Engine jeden einzelnen Datensatz durch und löscht ihn. Für jede gelöschte Zeile wird ein Eintrag im Transaktionsprotokoll gemacht. Wenn du Millionen von Zeilen hast, kann das echt langsam sein und deine Logdateien überladen.Sichere Vorgehensweisen bei SQL DELETE
Da ein „
DELETE“-Vorgang dauerhaft sein kann, helfen dir sichere Löschverfahren dabei, langsamer vorzugehen, deine Absicht zu überprüfen und zu planen, wie du Daten wiederherstellen kannst, falls etwas schiefgeht.Zeilen vor dem Löschen anzeigen
Bevor du eine „
DELETE“-Anweisung ausführst, solltest du immer mit einer „SELECT“-Anweisung eine Vorschau der Zeilen anzeigen, die du entfernen willst. Verwende dabei dieselbe „WHERE“-Bedingung, die du auch in deiner „DELETE“-Anweisung verwenden willst. Wenn die Anweisung „SELECT“ zu viele oder falsche Zeilen zurückgibt, kannst du das Problem beheben, bevor es zu Problemen kommt.2023-01-01Die folgende Abfrage sucht zum Beispiel nach Zeilen mit stornierten Bestellungen vor dem 1. Oktober 2017 und löscht dann mit denselben Filtern diese Datensätze.Transaktionen und Rollback nutzen
Wenn du die Operation „
DELETE“ in eine Transaktion einbaust, kannst du einen Befehl ausführen, sehen, wie viele Zeilen davon betroffen waren, und dann entscheiden, ob du die Änderung dauerhaft machen oder komplett rückgängig machen willst. Du kannst dann den „ROLLBACK“ nutzen, um die Daten wieder in ihren vorherigen Zustand zu bringen.Die folgende Abfrage löscht vorübergehend die entsprechenden Zeilen und stellt sie dann wieder her, sodass du die Auswirkungen überprüfen kannst, ohne Daten zu verlieren.
Dann kannst du die folgende Abfrage nutzen, um Nutzer, die sich zuletzt vor dem 1. Januar 2020 angemeldet haben, endgültig zu löschen.
Beachte aber, dass „
ROLLBACK” nur möglich ist, wenn du die Transaktion noch nicht bestätigt hast.SQL DELETE mit Joins und Unterabfragen
In echten Datenbanken sind Daten selten für sich allein. Meistens musst du Zeilen löschen, die auf Werten aus anderen Tabellen, abgelaufenen Konten, verwaisten Datensätzen oder nicht mehr zutreffenden zugehörigen Entitäten basieren.
Löschen von Zeilen basierend auf einer anderen Tabelle
Unterabfragen sind die beste und am weitesten verbreitete Methode, um Zeilen basierend auf einer anderen Tabelle zu löschen. Sie funktionieren mit fast allen SQL-Versionen. Die folgende Abfrage löscht zum Beispiel inaktive Benutzer aus der Tabelle „
Users“, deren Konten in der Tabelle „Accounts“ deaktiviert wurden.Du kannst Joins auch zum Löschen von Zeilen in einer Datenbank verwenden, aber die Syntax ist je nach Datenbank unterschiedlich, wie wir im nächsten Abschnitt sehen werden.
Datenbankspezifische DELETE-Syntax
Auch wenn die Idee hinter der Anweisung „
DELETE“ in SQL dieselbe ist, haben verschiedene Datenbanken unterschiedliche Syntax, wenn man „JOIN“ benutzt, um Zeilen aus einer Tabelle basierend auf einer anderen zu löschen.SQL Server fügt die Zieltabelle nach der Anweisung „
DELETE“ ein und fügt dann „FROM“ hinzu. Im folgenden Beispiel gibt der Alias nach „DELETE“ (u) an, welche Tabelle gelöscht wird.In PostgreSQL verhält sich das „
USING” wie ein „JOIN”. Nur die Zeilen aus der Zieltabelle (Users) werden gelöscht.MySQL lässt das Löschen mehrerer Tabellen zu, verlangt aber, dass die Tabellen ausdrücklich benannt werden. Du musst die zu löschende Tabelle vor der Klausel „
FROM“ platzieren.Ich empfehle dir , unseren Kurs „Joining Data in SQL” zu machen , umdie verschiedenen Arten von Joins in SQL kennenzulernenund zu lernen, wie man mit verschiedenen verwandten Tabellen in der Datenbank arbeitet.
SQL DELETE und referenzielle Integrität
Wie wir jetzt wissen, gibt's Tabellen in relationalen Datenbanken fast nie alleine. Sie sind oft über Fremdschlüssel miteinander verbunden. Wegen dieser Verknüpfungen kann das Löschen einer Zeile in einer Tabelle ungewollte Folgen haben.
Fremdschlüssel und Einschränkungsfehler
Wenn eine Tabelleüber einen Fremdschlüsselreferenziert wird, legt die Datenbanken fest, was passiert, wenn du versuchst, eine übergeordnete Zeile zu löschen. Standardmäßig verhindern die meisten Datenbanken das Löschen, wenn in einer untergeordneten Tabelle noch zugehörige Zeilen vorhanden sind.
Wenn du zum Beispiel eine Tabelle „
Orders” hast, die auf die Tabelle „Customers” verweist, wird das Löschen eines Kunden, der noch Bestellungen hat, mit einem Constraint-Fehler fehlschlagen. Das verhindert, dass die Datenbank verwaisten Datensätze enthält, die keinen gültigen übergeordneten Datensatz mehr haben.Kaskadierende Löschungen
Wenn du zugehörige Daten automatisch löschen willst, musst du eine Kaskadenregel festlegen, die der Datenbank sagt, wie sie mit den zugehörigen Daten umgehen soll. Die Methode „
ON DELETE CASCADE“ sagt der Datenbank, dass sie automatisch die zugehörigen untergeordneten Zeilen löschen soll, wenn eine übergeordnete Zeile entfernt wird.Die folgende Abfrage sagt der Datenbank zum Beispiel, dass sie automatisch alle Zeilen in der Tabelle „
Orders” löschen soll, die auf einen Kunden verweisen, wenn dieser Kunde aus der Tabelle „Customers” gelöscht wird.Der Vorteil von diesem Ansatz ist, dass die Datenbank sauber bleibt, ohne dass mehrere manuelle `
DELETE`-Anweisungen nötig sind. Du solltest die Anweisung aber vorsichtig einsetzen, weil ein einzelner Löschvorgang eine Kettenreaktion über mehrere Tabellen auslösen und viel mehr Daten als erwartet löschen kann. Du könntest zum Beispiel eine Zeile in der Tabelle „Departments“ löschen und dabei aus Versehen 500 Zeilen in der Tabelle „Employees“ wegschmeißen.Leistungsaspekte beim Löschen von Daten
Wenn du die Anweisung „
DELETE“ benutzt, wirst du merken, dass das Löschen einiger Zeilen sofort geht, aber langsam ist, wenn du Millionen von Zeilen hast. Beachte die folgenden bewährten Methoden, um Datensätze sicher zu löschen:DELETE vs. TRUNCATE für große Tabellen
Wie wir schon gesehen haben, löschen sowohl
DELETEals auchTRUNCATEDatensätze auf folgende Weise:DELETE: Es geht jede Zeile durch, schaut, ob sie den Kriterien entspricht, entfernt sie und schreibt die Änderung ins Transaktionsprotokoll. Das braucht viele Ressourcen und ist bei riesigen Datensätzen echt langsam. Es ermöglicht das Filtern mit einer „WHERE“-Klausel und unterstützt Rollbacks.TRUNCATE: Löscht alle Zeilen auf einmale mit minimaler Protokollierung. Es ist deutlich schneller, kann aber nicht gefiltert werden, lässt sich normalerweise nicht rückgängig machen und wird durch Fremdschlüsselbeschränkungen blockiert.Massenlöschungen und lang andauernde Vorgänge
Wenn du Millionen von Zeilen in einer einzigen Anweisung löschst, kann das deine ganze Anwendung ziemlich verlangsamen und sogar deine Datenbank zum Absturz bringen, wenn du das nicht richtig machst. Um dieses Risiko zu verringern, solltest du große Datensätze immer in mehreren Schritten löschen.
Beim Batch-Löschen werden nur ein paar Tausend Zeilen auf einmal gelöscht, also nicht so viele auf einmal. Dadurch bleibt die Datenbank reaktionsschnell und der Fortschritt lässt sich leicht überwachen. Wenn was schiefgeht, kannst du den Vorgang stoppen, ohne eine riesige Transaktion rückgängig machen zu müssen.
Häufige Fehler bei SQL DELETE
Hier sind die häufigsten Fehler, auf die du achten solltest, wenn du die DELETE-Anweisung zum Entfernen von Zeilen in deinen Tabellen verwendest:
Die WHERE-Klausel vergessen
Das Vergessen der „
WHERE“-Klausel ist der häufigste Fehler bei der Verwendung von „DELETE“. Ohne sie löscht die Anweisung jede Zeile in der Tabelle. Stell immer sicher, dass du die Klausel „WHERE“ benutzt, um die zu löschenden Zeilen anzugeben. Als Vorsichtsmaßnahme solltest du die zuvor besprochene Gewohnheit „SELECT-before-DELETE“ anwenden, um die Zeilen vor dem Löschen anzusehen.Angenommen, DELETE ist rückgängig machbar
Ein weiteres häufiges Missverständnis ist, dass gelöschte Daten immer wiederhergestellt werden können. Beachte, dass die Anweisung „
DELETE“ standardmäßig die Daten nach dem Commit als physisch von der Festplatte entfernt markiert, es sei denn, du hast Backups, Replikate oder Audit-Protokolle eingerichtet.Du kannst den Befehl „
DELETE“ nur rückgängig machen, wenn:SQL DELETE in Produktionsumgebungen
In Produktionssystemen geht es beim Befehl „
DELETE“ mehr um Kontrolle, Transparenz und Verantwortlichkeit als um die Syntax. In solchen Umgebungen geht's nicht nur darum, Daten zu löschen, sondern das sicher und bewusst zu machen.Zugriffskontrolle und Berechtigungen
Im Arbeitsalltag sollte das Löschen von Daten nach dem Prinzip der geringsten Rechte gehen. Nicht jeder Benutzer oder jedes Anwendungsdienstkonto sollte über Berechtigungen für „
DELETE“ verfügen.Den meisten „Nur-Lese“-Benutzern oder Reporting-Tools sollte dieses Recht ausdrücklich verweigert werden. Die meisten Firmen brauchen normalerweise eine „Peer Review“, bei der jemand anderes die „
WHERE“-Klausel eines manuellen Löschskripts checkt, bevor es in der Produktion läuft.Ich schlage vor, du probierst den Lernpfad „SQL Server für Datenbankadministratoren” aus, wenndu regelmäßig im Rahmen deiner Arbeit Datenbanken entwirfst oder wartest.
Prüfung und vorläufiges Löschen
Viele Produktionssysteme vermeiden endgültige Löschungen wegen der damit verbundenen Risiken. Stattdessen nutzen sie Soft Deletes, bei denen eine Zeile als gelöscht markiert wird. Du kannst zum Beispiel einen Zeitstempel „
deleted_at“ oder ein Flag „is_deleted“ verwenden, anstatt einen Datensatz physisch zu löschen.Soft Deletes machen die Wiederherstellung einfach, helfen bei der Überwachung und speichern alte Daten für Fehlerbehebung und Compliance.
Fazit
Das Wichtigste ist: Definiere immer eine klare „
WHERE“-Klausel, schau dir die betroffenen Zeilen mit „SELECT“ an und nutze Transaktionen, wann immer es geht. In Produktionssystemen sollte jede Löschung bewusst und nachprüfbar sein. Behandle „DELETE” genauso sorgfältig wie eine Schemaänderung oder eine Bereitstellung, dann bleibt es ein nützliches Tool und wird nicht zu einem teuren Fehler.Ich empfehle dir, unserenKurs „Datenbankdesign“ zu machen. Da lernst du, wie man Datenbanken erstellt und verwaltet und das passende DBMS für deine Bedürfnisse auswählt. Ich empfehle dir auch, unserenLernpfad als Associate Data Engineer in SQL auszuprobieren,um die Grundlagen des Data Engineering und Data Warehousing zu lernen.