Freigeben über


Löschen von Zeilen mithilfe von DELETE

Die DELETE-Anweisung entfernt eine Zeile oder mehrere Zeilen einer Tabelle oder Sicht.

In vereinfachter Form kann die DELETE-Syntax so aussehen:

DELETE table_or_view

FROM table_sources

WHERE search_condition

Der table_or_view-Parameter steht für den Namen einer Tabelle oder Sicht, aus der Zeilen gelöscht werden sollen. Alle Zeilen in table_or_view, die die Suchbedingungen der WHERE-Klausel erfüllen, werden gelöscht. Ist keine WHERE-Klausel angegeben, werden alle Zeilen in table_or_view gelöscht. Die FROM-Klausel gibt zusätzliche Tabellen oder Sichten und Verknüpfungsbedingungen an, die von den Prädikaten in der Suchbedingung der WHERE-Klausel zur Kennzeichnung der aus table_or_view. zu löschenden Zeilen verwendet werden können. Zeilen werden nicht aus den in der FROM-Klausel angegebenen Tabellen gelöscht, sondern lediglich aus der in table_or_view angegebenen Tabelle.

Jede Tabelle, aus der alle Zeilen entfernt wurden, verbleibt in der Datenbank. Die DELETE-Anweisung löscht lediglich Zeilen aus der Tabelle; die Tabelle muss mit der DROP TABLE-Anweisung aus der Datenbank entfernt werden.

Löschen von Zeilen aus einem Heap

Wenn Zeilen aus einem Heap gelöscht werden, kann Database Engine (Datenbankmodul) Zeilen- oder Seitensperren für den Vorgang verwenden. Folglich bleiben die durch den Löschvorgang geleerten Seiten weiterhin dem Heap zugeordnet. Wird die Zuordnung der leeren Seiten nicht aufgehoben, kann der zugeordnete Speicherplatz von anderen Objekten in der Datenbank nicht wiederverwendet werden.

Zum Löschen von Zeilen in einem Heap und zum Aufheben der Zuordnung von Seiten können Sie eine der folgenden Methoden anwenden.

  • Angeben des TABLOCK-Hinweises in der DELETE-Anweisung Durch den TABLOCK-Hinweis wendet der Löschvorgang eine freigegebene Sperre auf die Tabelle anstelle einer Zeilen- oder Seitensperre an. Dadurch wird die Zuordnung der Seiten aufgehoben. Weitere Informationen zum TABLOCK-Hinweis finden Sie unter Tabellenhinweise (Transact-SQL).

  • Verwenden von TRUNCATE TABLE, wenn alle Zeilen aus der Tabelle gelöscht werden sollen.

  • Erstellen eines gruppierten Indexes für den Heap vor dem Löschen der Zeilen. Nach dem Löschen der Zeilen können Sie den gruppierten Index löschen. Diese Methode ist zeitaufwändiger als die vorherigen Methoden und beansprucht mehr temporäre Ressourcen.

Weitere Informationen zu Sperren finden Sie unter Sperren im Datenbankmodul.

Beispiele

Das folgende Beispiel löscht alle Zeilen aus der SalesPersonQuotaHistory-Tabelle, weil keine WHERE-Klausel zum Beschränken der Anzahl der zu löschenden Zeilen verwendet wird.

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

Das folgende Beispiel löscht alle Zeilen aus der ProductCostHistory-Tabelle, bei denen der Wert in der StandardCost-Spalte größer als 1000.00 ist.

USE AdventureWorks;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

Im folgenden Beispiel wird die Transact-SQL-Erweiterung verwendet, um basierend auf einer Verknüpfung oder einer abhängigen Unterabfrage Datensätze aus einer Basistabelle zu löschen. Die erste DELETE-Anweisung zeigt die Lösung mit einer ISO-kompatiblen Unterabfrage, die zweite DELETE-Anweisung zeigt die Transact-SQL-Erweiterung an. Beide Abfragen entfernen Zeilen aus der SalesPersonQuotaHistory-Tabelle, basierend auf den in der SalesPerson-Tabelle gespeicherten Verkaufszahlen des laufenden Jahres.

-- SQL-2003 Standard subquery

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE SalesPersonID IN 
    (SELECT SalesPersonID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO