Die DELETE-Anweisung (delete_statement) löscht Zeilen einer Tabelle.
<delete_statement> ::=
DELETE [FROM] <table_name> [<reference_name>] [KEY <key_spec>,...]
[WHERE <search_condition>] [IGNORE TRIGGER] [NOWAIT]
| DELETE [FROM] <table_name> [<reference_name>] WHERE CURRENT OF <result_table_name> [NOWAIT]
SQL-Tutorial, Einfügen, Ändern, Löschen von
Zeilen
Der Tabellenname muss eine existierende Basistabelle, View-Tabelle oder ein Synonym identifizieren.
Der aktuelle Benutzer muss das DELETE-Privileg für die angegebene Tabelle besitzen. Falls der angegebene Tabellenname eine View-Tabelle identifiziert, ist es möglich, dass selbst der Eigentümer der View-Tabelle das DELETE-Privileg nicht besitzt, weil die View-Tabelle nicht änderbar ist.
Tabellenname identifiziert eine View-Tabelle: Die Zeilen der Basistabellen werden gelöscht, die der View-Tabelle zugrundeliegen.
Tabellenname identifiziert eine Join-View-Tabelle: Es werden nur folgende Zeilen gelöscht:
● Zeilen in der Schlüsseltabelle der Join-View-Tabelle
● Zeilen in Basistabellen, die der View-Tabelle zugrundeliegen und in einer 1:1-Beziehung zur Schlüsseltabelle stehen.
Welche Zeilen der angegebenen Tabelle gelöscht werden, wird durch eine der folgende Angaben festgelegt:
●
Optionale Folge von
Schlüsselspezifikationen und optionale Suchbedingung
Schlüsselspezifikation und keine
Suchbedingung: Es existiert eine Zeile mit den angegebenen
Schlüsselwerten. Diese Zeile wird gelöscht. Wenn keine Zeile mit den
angegebenen Schlüsselwerten existiert, wird keine Zeile gelöscht.
Schlüsselspezifikation und eine
Suchbedingung: Es existiert eine Zeile mit den angegebenen
Schlüsselwerten. Die Suchbedingung wird auf diese Zeile angewendet. Wenn die
Suchbedingung erfüllt ist, wird die Zeile gelöscht. Wenn keine Zeile mit den
angegebenen Schlüsselwerten existiert oder eine auf eine Zeile angewandte
Suchbedingung nicht erfüllt ist, wird keine Zeile gelöscht.
Keine Schlüsselspezifikation und eine
Suchbedingung: Die Suchbedingung wird auf jede Zeile der angegebenen
Tabelle angewendet. Alle Zeilen, die die Suchbedingung erfüllen, werden
gelöscht.
● Bei Verwendung von CURRENT OF, d.h. bei Angabe der Cursorposition innerhalb der Ergebnistabelle result_table_name: Wenn der Cursor nicht auf einer Zeile der Ergebnistabelle steht, wird keine Zeile gelöscht.
● Wurde keine der oben genannten möglichen Angaben vorgenommen, werden alle Zeilen der angegebenen Tabelle gelöscht.
● Wenn keine Zeile gefunden wird, die die durch die optionalen Klauseln definierten Bedingungen erfüllt, erscheint folgende Rückmeldung: 100 Zeile nicht gefunden
Wenn CURRENT OF angegeben ist, muss der Tabellenname in der FROM-Klausel der QUERY-Anweisung, mit der die Ergebnistabelle result_table_name aufgebaut wurde, mit dem Tabellennamen in der DELETE-Anweisung übereinstimmen.
Wenn CURRENT OF angegeben ist, und der Cursor auf einer Zeile der Ergebnistabelle steht, wird die korrespondierende Zeile gelöscht. Korrespondierend ist die Zeile aus der in der FROM-Klausel der QUERY-Anweisung angegebenen Tabelle, aus der die Zeile der Ergebnistabelle gebildet wurde. Voraussetzung dafür ist jedoch, dass die Ergebnistabelle mit FOR UPDATE spezifiziert wurde. Der Cursor steht anschließend hinter der Zeile der Ergebnistabelle. Es kann keine Aussage darüber getroffen werden, ob die Änderung in der korrespondierenden Zeile beim nächsten Zugriff auf die gleiche Zeile der Ergebnistabelle sichtbar ist oder nicht.
Wenn für Basistabellen, aus denen durch die DELETE-Anweisung Zeilen gelöscht werden, Trigger definiert wurden, die nach einer DELETE-Anweisung auszuführen sind, so werden diese ausgeführt. Scheitert einer dieser Trigger, scheitert die DELETE-Anweisung.
Sie können durch Angabe von IGNORE TRIGGER steuern, dass durch die DELETE-Anweisung kein DELETE-Trigger ausgeführt wird.
Wenn Sie NOWAIT angeben, dann wird im Fall einer Sperrkollision nicht auf die Freigabe einer Sperre gewartet, sondern sofort mit einem Fehler zurückgekehrt.
Für jede im Verlauf der DELETE-Anweisung gelöschte Zeile, die aus einer referenzierten Tabelle referenced_table mindestens einer referentiellen CONSTRAINT-Definition stammt, wird in Abhängigkeit von der DELETE-Regel der referentiellen CONSTRAINT-Definition eine der folgenden Aktionen durchgeführt:
● DELETE CASCADE: Alle Trefferzeilen in der korrespondierenden Fremdschlüsseltabelle werden gelöscht.
● DELETE RESTRICT: Falls es Trefferzeilen in der korrespondierenden Fremdschlüsseltabelle gibt, scheitert die DELETE-Anweisung.
● DELETE SET NULL: In allen Trefferzeilen der korrespondierenden Fremdschlüsseltabelle werden die entsprechenden Fremdschlüsselspalten mit dem NULL-Wert belegt.
● DELETE SET DEFAULT: In allen Trefferzeilen der korrespondierenden Fremdschlüsseltabelle werden die entsprechenden Fremdschlüsselspalten mit dem DEFAULT-Wert, der durch Angabe einer DEFAULT-Spezifikation gesetzt wurde, belegt.