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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
GO