11.2.1 delete 語法
delete 語句用來從表中刪除資料,其語法為:
各引數說明如下:
from
此引數為可選選項,用於連線delete 關鍵字和要刪除資料的物件名稱。 table_name
指定要刪除資料的表。 with ( [...n])
指定乙個或多個目標表允許的表提示。 view_name
指定用於刪除資料的檢視。 rowset_function_limited
行集合函式限制,即使用openquery() 或openrowset() 函式。 from
指定乙個額外的from 子句。這是delete 命令在transact-sql 語言中的擴充套件,它允許同時刪除多個表中的資料。其所含的引數包括join_table、 join_type 等,與第10 章「資料查詢」中from 子句中所講的一致。 where
指定限制資料刪除的條件。如果不指定where 子句,就會刪除表中的所有資料。在 where 子句中指定兩種形式的刪除操作。一種是搜尋刪,除即使用搜尋條件來限定要刪除的資料行:另一種是定位刪除,即使用current of 子句來指定乙個游標,刪除操作會在游標的當前位置產生。定位刪除比搜尋刪除更精確。 global
說明要使用的游標是全域性游標。如果不使用此選項,而又存在乙個全域性游標和乙個區域性游標同名的情況時,系統認為所選擇的游標是區域性游標。 cursor_name
指定開啟的游標名稱。此游標必須是允許更新的。 cursor_variable_name
指定游標變數的名稱。此游標變數必須是允許更新的。 option ( [,...n] )
請參見第10 章「資料查詢」中option 子句中所講述的引數。 table_hint
表提示用於指定乙個表的掃瞄計畫,即將要用於查詢優化器的乙個或多個索引,或乙個用於檢索資料的鎖定方法。此選項一般來說不必使用,查詢優化器會自動選擇乙個最優的執行方案。各表提示之間應使用逗號隔開。 index(index_val [,...n])
指定索引提示,即當執行命令時由sql server 使用的索引的名稱或id 號。每個表只能指定乙個索引提示。在表提示中最多可以指定250 非簇索引。 fastfirstrow
等價於option (fast 1) ,即對第一行返回資料採用查詢優化。 holdlock
一般情況下,當執行select 命令時,sql server 會在選取資料的過程中對該資料所屬的資料頁設定乙個共享鎖(shared lock, 關於鎖的介紹請參見本章後部分)。當sql server 讀到下乙個資料頁的資料時,上乙個資料頁的共享鎖就會被解除。但如果使用了 holdlock 選項,則在整個select 命令執行的過程中設定的共享鎖會一直存在。此選項不能在帶for browse 子句的select 語句中使用。此選項等價於serializable 選項。 nolock
一般情況下,當執行select 命令時,sql server 會在選取資料的過程中對該資料所屬的資料頁設定乙個共享鎖(shared lock, 關於鎖的介紹請參見本章後部分)。但如果使用了nolock 選項,則sql server 不會指定共享鎖,而且不管其它使用者是否正在更改所讀取的資料,select 命令仍然可以讀取資料。因此,使用此選項可能會讀取到其它使用者尚未提交的資料。此選項等價於readuncommitted 選項。 paglock
指定在select 命令執行時使用對資料頁做共享鎖。這是sql server 的內定方式。 readcommitted
指定資料掃瞄執行時使用與執行在read committed 孤立級上的事務相同的鎖語義。即select 命令不會返回尚未提交的資料。 readpast
跳過目前被鎖定的行。此選項只用於在事務執行在read committed 孤立級上的情況下。 readuncommitted
此選項等價於nolock 選項。 repeatableread
指定資料掃瞄執行時使用與執行在repeatable read 孤立級上的事務相同的鎖語義。即用select 命令讀取的資料在整個命令執行過程中不會被更改。此選項會影響系統的效能,非必要情況最好不用此選項。 rowlock
指定使用共享的行資料鎖,即使用行級別鎖定。 serializable
此選項等價於holdlock 選項。 tablock
指定用select 命令讀取資料時對所選取的表的全部資料做鎖定,直到整個命令執行完畢。如果指定了holdlock 選項,則共享的表鎖定會維持到事務結束。 tablockx
指定用select 命令讀取資料時對所選取的表的全部資料做鎖定,直到整個命令或事務執行完畢。 updlock
指定在select 命令執行時使用更新鎖(update lock),而不使用共享鎖,並且此更新鎖將維持到命令執行結束為止。如果省略where子句,則表示刪除表中的全部資料,但表的定義仍在資料庫中,也就是說,delete子句刪除的是表中的資料,而不是關於表的定義。 nolock、readuncommitied或readpast表提示不能用於作為插入、刪除或更新操作物件的表。
11.2.2 用delete 刪除資料
(1) 刪除一條記錄
例11-5 刪除編號為『10031011 』的員工記錄
use pangu
delete from employee
where emp_id = 』10031011』
(2) 刪除多條記錄
例11-6 刪除所有的部門資訊記錄
use pangu
delete from department_info /* 或使用 delete department_info */
這個例子刪除了department_info 表中的所有資料使它成為空表
(3) 帶子查詢的刪除語句
子查詢同樣可以巢狀在delete 語句中,用以構造執行刪除操作的條件。
例11-7: 刪除後勤部所有員工的記錄。
use pangu
delete from employee
where dept_id =
(select dept_id
from department
where d_name = 』後勤部』)
例11-8 刪除訂貨表前100 項記錄中所有產品編號為1003002 的產品
use pangu
delete orders
from (select top 100 * from orders) as orders_ top100
where orders.p_id = orders_ top100.p_id
(4) 刪除當前游標行資料
例11-9: 刪除游標dinfo_cursor 所指定的資料行。
delete from department_info
where current of dinfo_cursor
11.2.3 truncate table 命 令
如果要刪除表中的所有資料,那麼使用truncate table 命令比用delete 命令快得多。因為delete 命令除了刪除資料外,還會對所刪除的資料在事務處理日誌中作記錄,以防止刪除失敗時可以使用事務處理日誌來恢復資料;而truncate table 則只做刪除與表有關的所有資料頁的操作。truncate table 命令功能上相當於使用不帶where 子句的delete 命令。但是truncate table 命令不能用於被別的表的外關鍵字依賴的表。
truncate table 命令語法如下:
truncate table table_name
注意:由於truncate table命令不會對事務處理日誌進行資料刪除記錄操作,因此不能啟用觸發器。
例11-10: 刪除所有的部門資訊記錄。
use pangu
truncate table department_info
MS SQL入門基礎 刪除索引
8.4.1 用enterprise manager 刪除索引 在enterprise manager 中可以從如圖8 9 所示的索引管理對話方塊或如圖8 14 所示的表的屬性對話方塊中選擇要刪除的索引,再選 delete 按鈕來刪除索引。8.4.2 用drop index 命令刪除索引 drop i...
MS SQL入門基礎 刪除索引
8.4.1 用enterprise manager 刪除索引 在enterprise manager 中可以從如圖8 9 所示的索引管理對話方塊或如圖8 14 所示的表的屬性對話方塊中選擇要刪除的索引,再選 delete 按鈕來刪除索引。8.4.2 用drop index 命令刪除索引 drop i...
MS SQL入門基礎 更新資料
11.3.1 update 語法 使用者可以用update 語句來更新表中一列或多列資料值,其語法如下 各引數說明如下 setset 子句用於指定更新的方法,即用的值取代相應的列的值。如果省略 where 子句,那麼表中的所有資料均會受到影響。在from 子句中指定的表或列的別名不能用於set 子句...