Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

DELETE - Sätze löschen

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 ]
[WHERE {
suchbedingung | 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