DELETE löscht Sätze aus einer Tabelle.
Um einen Satz in der angegebenen Tabelle zu löschen, müssen Sie Eigentümer dieser Tabelle sein oder das DELETE-Privileg für diese Tabelle besitzen. Zusätzlich muss der Transaktionsmodus der aktuellen Transaktion READ WRITE sein.
Sind für die Tabelle bzw. die betroffenen Spalten Integritätsbedingungen definiert, werden diese nach dem Löschen geprüft. Ist eine Integritätsbedingung verletzt, werden die Löschungen rückgängig gemacht und ein entsprechender SQLSTATE gesetzt.
DELETE FROM
tabelle [[AS]
korrelationsname ]
suchbedingung
[WHERE { | CURRENT OF
cursor }]
tabelle
Name der Tabelle, aus der Sätze gelöscht werden sollen. Die Tabelle kann eine Basistabelle oder ein änderbarer View sein.
korrelationsname
Tabellenname, der innerhalb der suchbedingung eine Umbenennung für tabelle ist.
Bei jeder Spaltenangabe, die sich auf tabelle bezieht, müssen Sie den Spaltennamen mit dem neuen Namen korrelationsname qualifizieren, wenn der Spaltenname nicht eindeutig ist.
Der neue Name muss eindeutig sein, d.h. korrelationsname darf nur einmal in einer Tabellenangabe dieser Suchbedingung vorkommen.
Sie müssen eine Tabelle umbenennen, wenn die Spalten der Tabelle ohne Umbenennung nicht eindeutig angegeben werden können.
Außerdem können Sie eine Tabelle umbenennen, um durch entsprechende Namen einen Ausdruck verständlicher zu formulieren oder um lange Namen abzukürzen.
WHERE-Klausel
Die WHERE-Klausel gibt an, welche Sätze gelöscht werden.
WHERE-Klausel nicht angegeben:
Alle Sätze der Tabelle werden gelöscht.
suchbedingung
Bedingung, die die zu löschenden Sätze erfüllen müssen. Ein Satz wird nur gelöscht, wenn er die angegebene Suchbedingung erfüllt.
Spaltenangaben in suchbedingung außerhalb von Unterabfragen dürfen sich nur auf die angegebene Tabelle tabelle beziehen.
Unterabfragen in suchbedingung dürfen sich nicht direkt oder indirekt auf die Basistabelle beziehen, aus der Sätze gelöscht werden sollen.
CURRENT OF cursor
Name des Cursors, über den die zu löschenden Sätze ausgewählt werden. Der Cursor muss änderbar sein (siehe Abschnitt „Cursor definieren"), und tabelle muss die zu Grunde liegende Tabelle sein.
Der Cursor muss in derselben Übersetzungseinheit vereinbart sein. Er muss offen sein. Er muss vor der DELETE-Anweisung mit FETCH auf einen Satz der Ergebnistabelle positioniert worden sein.
DELETE löscht den Satz in tabelle, der sich aus der aktuellen Cursorposition ergibt.
Nach DELETE zeigt der Cursor vor den nachfolgenden Satz der Ergebnistabelle bzw. hinter den Letzten, wenn es keinen weiteren Satz gibt. Für eine weitere DELETE...WHERE CURRENT OF-Anweisung müssen Sie den Cursor zuerst wieder mit FETCH auf einen Satz der Ergebnistabelle positionieren.
DELETE ist nicht erlaubt, wenn für den geöffneten Cursor cursor der Schubmodus eingeschaltet ist (siehe Abschnitt „Pragma PREFETCH").
Wurde ein Cursor mit der WITH HOLD-Klausel definiert, dann darf ein DELETE erst erfolgen, nachdem in derselben Transaktion eine FETCH-Anweisung für diesen Cursor ausgeführt wurde.
DELETE und Transaktionssicherung
DELETE leitet außerhalb von Routinen eine SQL-Transaktion ein, wenn keine Transaktion offen ist. Durch die Definition eines Isolationslevels bei konkurrierenden Transaktionen können Sie steuern, welche Auswirkungen die DELETE-Anweisung auf diese Transaktionen hat (siehe Abschnitt „SET TRANSACTION - Transaktionseigenschaften festlegen").
Tritt während der DELETE-Anweisung ein Fehler auf, so werden alle bereits durchgeführten Löschungen rückgängig gemacht.
Beispiele
Alle in Hannover ansässigen Kunden werden aus der Tabelle KUNDE gelöscht.
DELETE FROM kunde WHERE ort = 'Hannover'
In der Tabelle KONTAKT sollen alle Kunden gelöscht werden, für die in der Tabelle KUNDE als Land „USA“ eingetragen ist. Die Anweisung wird nur ausgeführt, wenn die Referenzbedingung KONR_REF_KONTAKT der Tabelle AUFTRAG nicht verletzt wird.
DELETE FROM kontakt WHERE knr = (SELECT knr FROM kunde WHERE land='USA')
In diesem Beispiel wird ein Cursor verwendet, um die Kunden aus Hannover aus der Tabelle KUNDE zu löschen.
DECLARE cur_kunden CURSOR FOR SELECT knr, firma, ort FROM kunde WHERE ort = 'Hannover' FOR UPDATE OPEN cur_kunden
Mit einer Folge von FETCH- und DELETE-Anweisungen können nun alle gefundenen Sätze gelöscht werden.
FETCH cur_kunden INTO :KNR, :FIRMA, :ORT DELETE FROM kunde WHERE CURRENT OF cur_kunden
In diesem Beispiel werden mit einem Cursor die Aufträge aus der Tabelle AUFTRAG ausgewählt, die bereits abgelegt sind (ASTNR = 5). Die Einträge zu diesen Aufträgen werden anschließend in den Tabellen LEISTUNG und AUFTRAG gelöscht.
DECLARE cur_auftrag1 CURSOR FOR SELECT anr, atext FROM auftrag WHERE astnr = 5 FOR UPDATE FETCH cur_auftrag1 INTO :AUFTRAG.ANR DELETE FROM auftrag WHERE CURRENT OF cur_auftrag1 DELETE FROM leistung WHERE anr = :AUFTRAG.ANR
Siehe auch
INSERT, UPDATE