MySQL刪除表操作(delete、truncate、drop的區別)

http://www.zifengjiaju.com/ArtInfo/31126.html

簡介
delete
1、刪除整張表的數據:

delete from table_name;


2、刪除部分數據,添加where子句:

delete from table_name where...;

3、說明
  1)、屬於DML語言,每次刪除一行,都在事務日誌中爲所刪除的每行記錄一項。產生rollback,事務提交之後才生效;如果有相應的 trigger,執行的時候將被觸發,如果刪除大數據量的錶速度會很慢。
  2)、刪除表中數據而不刪除表的結構(定義),同時也不釋放空間。

truncate
1、只能操作表,將表中數據全部刪除,在功能上和不帶where子句的delete語句相同:

truncate table table_name;

2、說明
  1)、默認情況下,truncate通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。所以使用的系統和事務日誌資源少,可以使用reuse storage; truncate會將高水線復位(回到最開始).
  2 )、 truncate是DDL語言, 操作立即生效,自動提交,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger.
  3 )、刪除內容、釋放空間但不刪除表的結構(定義)。

drop
1、drop語句將刪除表的結構,以及被依賴的約束(constrain),觸發器(trigger),索引(index);

drop table table_name;

2、說明
  1)、刪除之後,依賴於該表的存儲過程/函數將保留,但是變爲invalid狀態.
  2)、drop也屬於DDL語言,立即執行,執行速度最快
  3)、刪除內容和定義,釋放空間。

區別
1、表和索引所佔空間:
  當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小;
  DELETE操作不會減少表或索引所佔用的空間;
  DROP語句將表所佔用的空間全釋放掉。
  
2、應用範圍:
  TRUNCATE 只能對table;
  DELETE可以是table和view。

3、執行速度:
  drop > truncate > delete

4、delete from刪空表後,會保留一個空的頁,truncate在表中不會留有任何頁。

5、DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作爲事務記錄在日誌中保存以便進行進行回滾操作。
  TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

6、當使用行鎖執行 DELETE 語句時,將鎖定表中各行以便刪除。truncate始終鎖定表和頁,而不是鎖定各行。

7、如果有identity產生的自增id列,delete from後仍然從上次的數開始增加,即種子不變;
 使用truncate刪除之後,種子會恢復到初始值。

總結
1、delete 語句可以使用where子句實現部分刪除,而truncate不可以,會將表中的整個數據全部刪除,使用時,可以按需求選擇;
2、如果想從表中刪除所有的數據,不要使用delete,可以使用truncate語句,因爲這樣執行速度更快。truncate語句實際是刪除原來的表然後重新建立一個新表;
3、在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除表結構使用drop;
4、對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。

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