SQL truncate 、delete與drop區別

相同點:html

1.truncate和不帶where子句的delete、以及drop都會刪除表內的數據。數據庫

2.drop、truncate都是DDL語句(數據定義語言),執行後會自動提交。安全

 

不一樣點:架構

1. truncate 和 delete 只刪除數據不刪除表的結構(定義)
drop 語句將刪除表的結構被依賴的約束(constrain)、觸發器(trigger)、索引(index);依賴於該表的存儲過程/函數將保留,可是變爲 invalid 狀態。函數

 

2. delete 語句是數據庫操做語言(dml),這個操做會放到 rollback segement 中,事務提交以後才生效;若是有相應的 trigger,執行的時候將被觸發。
truncate、drop 是數據庫定義語言(ddl),操做當即生效,原數據不放到 rollback segment 中,不能回滾,操做不觸發 trigger。spa

 

3.delete 語句不影響表所佔用的 extent,高水線(high watermark)保持原位置不動
drop 語句將表所佔用的空間所有釋放。
truncate 語句缺省狀況下見空間釋放到 minextents個 extent,除非使用reuse storage;truncate 會將高水線復位(回到最開始)。日誌

 

4.速度,通常來講: drop> truncate > deletehtm

 

5.安全性:當心使用 drop 和 truncate,尤爲沒有備份的時候.不然哭都來不及
使用上,想刪除部分數據行用 delete,注意帶上where子句. 回滾段要足夠大.
想刪除表,固然用 drop
想保留表而將全部數據刪除,若是和事務無關,用truncate便可。若是和事務有關,或者想觸發trigger,仍是用delete。
若是是整理表內部的碎片,能夠用truncate跟上reuse stroage,再從新導入/插入數據。索引


6.delete是DML語句,不會自動提交。drop/truncate都是DDL語句,執行後會自動提交。事務

 

七、TRUNCATE   TABLE   在功能上與不帶   WHERE   子句的   DELETE   語句相同:兩者均刪除表中的所有行。但   TRUNCATE   TABLE   比   DELETE   速度快,且使用的系統和事務日誌資源少。DELETE   語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。TRUNCATE   TABLE   經過釋放存儲表數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放。 

 

八、TRUNCATE   TABLE   刪除表中的全部行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置爲該列的種子。若是想保留標識計數值,請改用   DELETE。若是要刪除表定義及其數據,請使用   DROP   TABLE   語句。  
    
九、對於由   FOREIGN   KEY   約束引用的表,不能使用   TRUNCATE   TABLE,而應使用不帶   WHERE   子句的   DELETE   語句。因爲   TRUNCATE   TABLE   不記錄在日誌中,因此它不能激活觸發器。    
 

十、TRUNCATE   TABLE   不能用於參與了索引視圖的表。  

 

SQL中Truncate的用法(轉)

轉自:http://www.studyofnet.com/news/555.html

本文導讀:刪除表中的數據的方法有delete,truncate, 其中TRUNCATE TABLE用於刪除表中的全部行,而不記錄單個行刪除操做。TRUNCATE TABLE 與沒有 WHERE 子句的 DELETE 語句相似;可是,TRUNCATE TABLE 速度更快,使用的系統資源和事務日誌資源更少。下面介紹SQL中Truncate的用法

Truncate是一個可以快速清空資料表內全部資料的SQL語法。而且能針對具備自動遞增值的字段,作計數重置歸零從新計算的做用。

 

1、Truncate語法


[ { database_name.[ schema_name ]. | schema_name . } ]
    table_name
[ ; ]
 

參數


database_name
數據庫的名稱。


schema_name
表所屬架構的名稱。


table_name
要截斷的表的名稱,或要刪除其所有行的表的名稱。

 

2、Truncate使用注意事項

 

一、TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:兩者均刪除表中的所有行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。

 

二、DELETE 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。TRUNCATE TABLE 經過釋放存儲表數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放。

 

三、TRUNCATE TABLE 刪除表中的全部行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置爲該列的種子。若是想保留標識計數值,請改用 DELETE。若是要刪除表定義及其數據,請使用 DROP TABLE 語句。

 

四、對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。因爲 TRUNCATE TABLE 不記錄在日誌中,因此它不能激活觸發器。

 

五、TRUNCATE TABLE 不能用於參與了索引視圖的表。

 

六、對用TRUNCATE TABLE刪除數據的表上增長數據時,要使用UPDATE STATISTICS來維護索引信息。

 

七、若是有ROLLBACK語句,DELETE操做將被撤銷,但TRUNCATE不會撤銷。

 

 

 

3、不能對如下表使用 TRUNCATE TABLE

 


一、由 FOREIGN KEY 約束引用的表。(您能夠截斷具備引用自身的外鍵的表。)


二、參與索引視圖的表。


三、經過使用事務複製或合併複製發佈的表。


四、對於具備以上一個或多個特徵的表,請使用 DELETE 語句。


五、TRUNCATE TABLE 不能激活觸發器,由於該操做不記錄各個行刪除。

 

 

 

4、TRUNCATE、Drop、Delete區別

 

 
1.drop和delete只是刪除表的數據(定義),drop語句將刪除表的結構、被依賴的約束(constrain)、觸發器 (trigger)、索引(index);依賴於該表的存儲過程/函數將保留,可是變爲invalid狀態。

2.delete語句是DML語言,這個操做會放在rollback segement中,事物提交後才生效;若是有相應的觸發器(trigger),執行的時候將被觸發。truncate、drop是DDL語言,操做後即 生效,原數據不會放到rollback中,不能回滾,操做不會觸發trigger。

3.delete語句不影響表所佔用的extent、高水線(high watermark)保持原位置不動。drop語句將表所佔用的空間所有釋放。truncate語句缺省狀況下將空間釋放到minextents的 extent,除非使用reuse storage。truncate會將高水線復位(回到最初)。

4.效率方面:drop > truncate > delete

5.安全性:當心使用drop與truncate,尤爲是在 沒有備份的時候,想刪除部分數據可以使用delete須要帶上where子句,回滾段要足夠大,想刪除表能夠用drop,想保留表只是想刪除表的全部數據、 若是跟事物無關可使用truncate,若是和事物有關、又或者想觸發 trigger,仍是用delete,若是是整理表內部的碎片,能夠用truncate跟上reuse stroage,再從新導入、插入數據。

6.delete是DML語句,不會自動提交。drop/truncate都是DDL語句,執行後會自動提交。

七、drop通常用於刪除總體性數據 如表,模式,索引,視圖,完整性限制等;delete用於刪除局部性數據 如表中的某一元組

八、DROP把表結構都刪了;DELETE只是把數據清掉

九、當你再也不須要該表時, 用 drop;當你仍要保留該表,但要刪除全部記錄時, 用 truncate;當你要刪除部分記錄時(always with a WHERE clause), 用 delete.

相關文章
相關標籤/搜索