Truncate的使用詳解
刪除表中數據的方法有 delete 和 truncate, 其中TRUNCATE TABLE用于刪除表中的所有行,而不記錄單個行刪除操作;TRUNCATE TABLE 與沒有 WHERE 子句的 DELETE 語句類似,但是,TRUNCATE TABLE 速度更快,使用的系統資源和事務日志資源更少。下面介紹Truncate的用法
1.truncate使用語法
Truncate 語法能夠快速清空數據表內所有數據,并且能針對具有自動遞增值的字段,做計數重置歸零重新計算的作用,只能作用于表。
Truncate的語法很簡單,后面直接跟表名即可,例如: truncate table tbl_name 或者 truncate tbl_name 。
執行truncate語句時需要擁有表的drop權限,從邏輯上講,truncate table類似于delete刪除所有行的語句或 drop table然后再create table語句的組合。為了實現高性能,它繞過了刪除數據的DML方法,因此,它不能回滾。盡管truncate table與delete相似,但它被分類為DDL語句而不是DML語句。
2.truncate與drop,delete的對比
truncate 與 delete、drop 三者之間的異同:
delete語句是DML語言,操作后會放在 rollback segement 中,事物提交后才生效,如果有相應的觸發器(trigger),執行時將被觸發,可回滾。truncate、drop 是DDL語言,執行后會自動提交立即生效,原數據不會放到 rollback中,不能回滾,操作不會觸發trigger。
Delete 語句每次刪除一行,并在事務日志中為所刪除的每行記錄一項。Truncate Table 通過釋放存儲表數據所用的數據頁來刪除數據,并且只在事務日志中記錄頁的釋放。
truncate和 delete 只刪除表的數據(定義),表結構及其約束、索引等保持不變;drop語句將刪除表的結構、被依賴的約束(constrain)、觸發器 (trigger)、索引(index),依賴于該表的存儲過程/函數將保留,但是變為invalid狀態。
truncate后會使表和索引所占用的空間會恢復到初始大小;delete操作不會減少表或索引所占用的空間,drop語句將表所占用的空間全釋放掉。
Truncate Table 在功能上與不帶 Where子句的 Delete 語句相同:二者均刪除表中的全部行,但 Truncate Table 比 Delete 速度快,且使用的系統和事務日志資源少。
truncate只能作用于表;delete,drop可作用于表、視圖。truncate 清空表中所有數據;drop一般用于刪除整體性數據 ,如表、模式、索引、視圖、完整性限制等;delete用于刪除局部性數據 如表中的某一元組。
在安全性方面,要謹慎使用 drop、truncate,特別是沒有做備份的情況下:如何表數據完全不需要時可以用truncate;如果想刪除部分數據可使用 delete 需要帶上 where子句,回滾段要足夠大;如果想刪除表可以用 drop;如果想保留表而將所有數據刪除且和事務無關,用truncate即可;如果和事物有關,或者想觸發 trigger,則使用delete;如果是整理表內部的碎片,可以用 truncate 跟上 reuse stroage,再重新導入、插入數據。
3.truncate注意事項
無論怎樣,truncate表都是高危操作,特別是在生產環境要更加謹慎使用,下面列出幾點注意事項。
Truncate Table 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 Delete 。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。
對于由 Foreign Key (外鍵) 約束引用的表,不能使用 Truncate Table,而應使用不帶 Where子句的 Delete 語句。由于 Truncate Table 不記錄在日志中,所以它不能激活觸發器。
Truncate Table 不能用于參與了索引視圖的表。
對用 Truncate Table 刪除數據的表增加數據時,要使用Update Statistics 來維護索引信息。
如果有 Rollback 語句,Delete 操作將被撤銷,但 Truncate 不會撤銷。
執行 Truncate 需要 drop權限,不建議給賬號drop權限;執行 Truncate 前一定要再三檢查確認,最好提前備份下表數據。
4.truncate不宜使用場景
由 FOREIGN KEY 約束引用的表(可以截斷具有引用自身的外鍵的表)
參與索引視圖的表
通過使用事務復制或合并復制發布的表
對于具有以上一個或多個特征的表,請使用 DELETE 語句
TRUNCATE TABLE 不能激活觸發器,因為該操作不記錄各個行刪除

浙公網安備 33010602011771號