從表中刪除行。
DELETE
[ FROM ]
{ table_name WITH ( < table_hint_limited > [ ...n ] )
| view_name
| rowset_function_limited
}
[ FROM { < table_source > } [ ,...n ] ]
[ WHERE
{ < search_condition >
| { [ CURRENT OF
{ { [ GLOBAL ] cursor_name }
| cursor_variable_name
}
] }
}
]
[ OPTION ( < query_hint > [ ,...n ] ) ]
< table_source > ::=
table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ]
| rowset_function [ [ AS ] table_alias ]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| < joined_table >
< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition >
| < table_source > CROSS JOIN < table_source >
| < joined_table >
< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ < join_hint > ]
JOIN
< table_hint_limited > ::=
{ FASTFIRSTROW
| HOLDLOCK
| PAGLOCK
| READCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}
< table_hint > ::=
{ INDEX ( index_val [ ,...n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}
< query_hint > ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| FAST number_rows
| FORCE ORDER
| MAXDOP
| ROBUST PLAN
| KEEP PLAN
}
FROM
是可選的關(guān)鍵字,可用在 DELETE 關(guān)鍵字與目標(biāo) table_name、view_name 或 rowset_function_limited 之間。
table_name
是要從其中刪除行的表的名稱。
在其作用域內(nèi)的 table 變量、或是將 OPENDATASOURCE 函數(shù)作為服務(wù)器名稱的由四部分組成的表名(或視圖名稱)還可以在 DELETE 語句中作為表源使用。
WITH (<table_hint_limited> [...n])
指定目標(biāo)表所允許的一個或多個表提示。需要有 WITH 關(guān)鍵字和圓括號。不允許有 READPAST、NOLOCK 和 READUNCOMMITTED。有關(guān)表提示的更多信息,請參見 FROM。
view_name
是視圖名稱。在視圖的 FROM 子句中,view_name 引用的視圖必須可更新且正確引用一個基表。有關(guān)可更新視圖的更多信息,請參見 CREATE VIEW。
說明 如果表或視圖存在于另一個數(shù)據(jù)庫內(nèi)或有一個不同于當(dāng)前用戶的所有者,則使用格式為 server_name.database.[owner].object_name 的由四部分組成的合法名稱。有關(guān)更多信息,請參見 Transact-SQL 語法規(guī)則。
rowset_function_limited
OPENQUERY 或 OPENROWSET 函數(shù),視提供程序功能而定。有關(guān)提供程序所需功能的更多信息,請參見 OLE DB 提供程序的 UPDATE 和 DELETE 語句要求。有關(guān)行集函數(shù)的更多信息,請參見 OPENQUERY 和 OPENROWSET。
FROM < table_source >
指定附加的 FROM 子句。這個對 DELETE 的 Transact-SQL 擴展使您得以從 <table_sources> 指定數(shù)據(jù),并從第一個 FROM 子句內(nèi)的表中刪除相應(yīng)的行。
這個擴展指定聯(lián)接,可在 WHERE 子句中取代子查詢來標(biāo)識要刪除的行。
<joined_table>
由兩個或更多表的積組成的結(jié)果集,例如:
SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
ON tab3.c1 = tab4.c1
ON tab2.c3 = tab4.c3
對于多個 CROSS 聯(lián)接,請使用圓括號來更改聯(lián)接的自然順序。
<join_type>
指定聯(lián)接操作的類型。
ON <search_condition>
指定聯(lián)接所基于的條件。盡管經(jīng)常使用列和比較運算符,但此條件可指定任何謂詞,例如:
FROM Suppliers JOIN Products
ON (Suppliers.SupplierID = Products.SupplierID)
當(dāng)條件指定列時,列不必具有相同的名稱或數(shù)據(jù)類型;但是,如果數(shù)據(jù)類型不一致,則這些列必須相互兼容或是 Microsoft® SQL Server™ 能夠隱性轉(zhuǎn)換的類型。如果數(shù)據(jù)類型不能隱性轉(zhuǎn)換,則條件必須使用 CAST 函數(shù)顯式轉(zhuǎn)換數(shù)據(jù)類型。
有關(guān)搜索條件和謂詞的更多信息,請參見搜索條件。
CROSS JOIN
指定兩個表的矢量積。這將返回相同的行,就好像在舊式的非 SQL-92 式聯(lián)接中并沒有指定 WHERE 子句。
WHERE
指定用于限制刪除行數(shù)的條件。如果沒有提供 WHERE 子句,則 DELETE 刪除表中的所有行?;?WHERE 子句中所指定的條件,有兩種形式的刪除操作。
OPTION (<query_hint> [,...n] )
是表示使用優(yōu)化程序提示自定義 SQL Server 的語句處理的關(guān)鍵字。
說明 如果還為 FROM 子句中的某對鏈接表指定了 <joint_hint>,則這個提示優(yōu)先于 OPTION 子句中所指定的任何 <join_hint>。
KEEP PLAN
強制查詢優(yōu)化器對查詢放寬估計的重新編譯閾值。當(dāng)對表中索引列的更改(更新、刪除或插入)達到估計數(shù)目時查詢會自動重新編譯,該估計數(shù)目即為重新編譯閾值。指定 KEEP PLAN 將確保當(dāng)表有多個更新時不會頻繁地對查詢進行重新編譯。
如果所修改的對象是 table 變量,則 DELETE 可用在用戶定義函數(shù)的正文中。
對于由四部分組成的表名(或視圖名稱),若其中的服務(wù)器名稱使用的是 OPENDATASOURCE 函數(shù),則該表名可以在表名能夠出現(xiàn)的任何位置作為表源使用。
如果 DELETE 語句違反了觸發(fā)器,或試圖刪除另一個有 FOREIGN KEY 約束的表內(nèi)的數(shù)據(jù)所引用的行,則可能會失敗。如果 DELETE 刪除了多行,而在刪除的行中有任何一行違反觸發(fā)器或約束,則將取消該語句,返回錯誤且不刪除任何行。
如果在對表或視圖的 DELETE 操作上定義了 INSTEAD-OF 觸發(fā)器,該觸發(fā)器將執(zhí)行 instead of DELETE 語句。SQL Server 的早期版本只支持 DELETE 上的 AFTER 觸發(fā)器和其它修改語句。
當(dāng) DELETE 語句遇到在表達式評估過程中發(fā)生的算術(shù)錯誤(溢出、被零除或域錯誤)時,SQL Server 將處理這些錯誤,就好象 SET ARITHABORT 打開一樣。將取消批處理中的其余部分并返回錯誤信息。
對遠程表和本地及遠程分區(qū)視圖上的 DELETE 語句將忽略 SET ROWCOUNT 選項的設(shè)置。
如果要刪除在表中的所有行,則 TRUNCATE TABLE 比 DELETE 快。DELETE 以物理方式一次刪除一行,并在事務(wù)日志中記錄每個刪除的行。TRUNCATE TABLE 則釋放所有與表關(guān)聯(lián)的頁。因此,TRUNCATE TABLE 比 DELETE 快且需要的事務(wù)日志空間更少。TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 相當(dāng),但是 TRUNCATE TABLE 不能用于由外鍵引用的表。DELETE 和 TRUNCATE TABLE 都使刪除的行所占用的空間可用于存儲新數(shù)據(jù)。
默認(rèn)情況下,將 DELETE 權(quán)限授予 sysadmin 固定服務(wù)器角色成員、db_owner 和 db_datawriter 固定數(shù)據(jù)庫角色成員以及表所有者。sysadmin、db_owner 和 db_securityadmin 角色成員和表所有者可以將權(quán)限轉(zhuǎn)讓給其他用戶。
如果語句包含 WHERE 子句,則還必須有 SELECT 權(quán)限。
下例從 authors表中刪除所有行。
USE pubs
DELETE authors
因為 au_lname 可能不是唯一的,下例刪除其中的 au_lname 是 McBadden 的所有行。
USE pubs
DELETE FROM authors
WHERE au_lname = 'McBadden'
下例顯示在名為 complex_join_cursor 的游標(biāo)上所做的刪除。它只影響當(dāng)前從游標(biāo)提取的單行。
USE pubs
DELETE FROM authors
WHERE CURRENT OF complex_join_cursor
下例顯示基于聯(lián)接或相關(guān)子查詢從基表中刪除記錄的 Transact-SQL 擴展。第一個 DELETE 顯示與 SQL-92 兼容的子查詢解決方法,第二個 DELETE 顯示 Transact-SQL 擴展。兩個查詢都基于存儲在 titles 表中的標(biāo)題從 titleauthors 表中刪除行。
/* SQL-92-Standard subquery */
USE pubs
DELETE FROM titleauthor
WHERE title_id IN
(SELECT title_id
FROM titles
WHERE title LIKE '%computers%')
/* Transact-SQL extension */
USE pubs
DELETE titleauthor
FROM titleauthor INNER JOIN titles
ON titleauthor.title_id = titles.title_id
WHERE titles.title LIKE '%computers%'
由于可以在 DELETE 語句中指定 SELECT 語句,因此還可以在 SELECT 語句中使用 TOP 子句。例如,下例從 authors 表中刪除前 10 個作者。
DELETE authors相關(guān)文章
FROM (SELECT TOP 10 * FROM authors) AS t1
WHERE authors.au_id = t1.au_id