Truncate用法詳解

前言: 

 

當我們想要清空某張表時,往往會使用truncate語句。大多時候我們只關心能否滿足需求,而不去想這類語句的使用場景及注意事項。本篇文章主要介紹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很相似,其實這三者還是與很大的不同的,下面簡單對比下三者的異同。

 

  • truncate與drop是DDL語句,執行後無法回滾;delete是DML語句,可回滾。

  • truncate只能作用於表;delete,drop可作用於表、視圖等。

  • truncate會清空表中的所有行,但表結構及其約束、索引等保持不變;drop會刪除表的結構及其所依賴的約束、索引等。

  • truncate會重置表的自增值;delete不會。

  • truncate不會激活與表有關的刪除觸發器;delete可以。

  • truncate後會使表和索引所佔用的空間會恢復到初始大小;delete操作不會減少表或索引所佔用的空間,drop語句將表所佔用的空間全釋放掉。

 

3.truncate使用場景及注意事項

 

通過前面介紹,我們很容易得出truncate語句的使用場景,即該表數據完全不需要時可以用truncate。如果想刪除部分數據用delete,注意帶上where子句;如果想刪除表,當然用drop;如果想保留表而將所有數據刪除且和事務無關,用truncate即可;如果和事務有關,或者想觸發trigger,還是用delete;如果是整理表內部的碎片,可以用truncate然後再重新插入數據。

 

無論怎樣,truncate表都是高危操作,特別是在生產環境要更加小心,下面列出幾點注意事項,希望大家使用時可以做下參考。

 

  • truncate無法通過binlog回滾。

  • truncate會清空所有數據且執行速度很快。

  • truncate不能對有外鍵約束引用的表使用。

  • 執行truncate需要drop權限,不建議給賬號drop權限。

  • 執行truncate前一定要再三檢查確認,最好提前備份下表數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章