使用 DELETE 刪除資料列

DELETE 陳述式可以移除資料表或檢視中的一或多個資料列。

DELETE 語法的簡化形式為:

DELETE table_or_view

FROM table_sources

WHERE search_condition

table_or_view 參數表示要從中刪除資料列的資料表或檢視。在 table_or_view 中,所有符合 WHERE 搜尋條件的資料列將被刪除。如果沒有指定 WHERE 子句,將刪除所有 table_or_view 中的資料列。FROM 子句可指定其他資料表或檢視,和聯結可由 WHERE 子句搜尋條件中之述詞使用的條件,限制要從 table_or_view. 刪除的資料列。資料列不會從 FROM 子句中命名的資料表刪除,只會從 table_or_view 中命名的資料表刪除。

資料庫將保留所有資料列均被移除的資料表。DELETE 陳述式只能刪除資料表中的資料列,只有使用 DROP TABLE 陳述式才可從資料庫中移除資料表。

刪除堆積中的資料列

堆積中刪除資料列後,Database Engine 可能會針對作業使用資料列或頁面鎖定。如此一來,由刪除作業清空的頁面仍然會配置給堆積。如果未取消空白頁面的配置,資料庫中的其他物件就無法重複使用相關聯的空間。

若要刪除堆積中的資料列及取消配置頁面,請使用下列其中一個方法。

  • 在 DELETE 陳述式中指定 TABLOCK 提示。使用 TABLOCK 提示會造成刪除作業對資料表進行共用鎖定,而非資料列或頁面鎖定。如此可允許取消配置頁面。如需有關 TABLOCK 提示的詳細資訊,請參閱<資料表提示 (Transact-SQL)>。

  • 如果要從資料表刪除所有資料列,請使用 TRUNCATE TABLE。

  • 請先在堆積上建立叢集索引之後,再刪除資料列。您可以在刪除資料列之後卸除叢集索引。這個方法會比之前的方法耗用更多的時間,而且會使用更多的暫存資源。

如需有關鎖定的詳細資訊,請參閱<Database Engine 中的鎖定>。

範例

下列範例會刪除 SalesPersonQuotaHistory 資料表中的所有資料列,因為並未利用 WHERE 子句來限制刪除的資料列數。

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

下列範例會刪除 ProductCostHistory 資料表中,所有 StandardCost 資料行值超出 1000.00 的資料列。

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

下列範例會顯示從以聯結或相關子查詢為基礎的基底資料表中刪除記錄時,所用的 Transact-SQL 延伸模組。第一個 DELETE 陳述式會顯示 ISO 相容子查詢方案,而第二個 DELETE 陳述式會顯示 Transact-SQL 延伸模組。這兩個查詢都會從以 SalesPerson 資料表所儲存之年度目前銷售情況為基礎的 SalesPersonQuotaHistory 資料表中移除資料列。

-- 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