mysql中drop、truncate與delete的區別詳析
1. drop:刪除數據庫
- drop語句將表所占用的空間全釋放掉。
- drop > truncate > delete
方式1:如果要刪除的數據庫存在,則刪除成功。如果不存在,則報錯
DROP DATABASE mytest1;
方式2:推薦。 如果要刪除的數據庫存在,則刪除成功。如果不存在,則默默結束,不會報錯。
DROP DATABASE IF EXISTS mytest1;
2. 對比 TRUNCATE TABLE 和 DELETE FROM
相同點:都可以實現對表中所有數據的刪除,同時保留表結構。
不同點:
- TRUNCATE TABLE:一旦執行此操作,表數據全部清除。同時,數據是不可以回滾的。
- DELETE FROM:一旦執行此操作,表數據可以全部清除(不帶WHERE)。同時,數據是可以實現回滾的。
3. DDL 和 DML 的說明
① DDL(CREATE 、 DROP 、 ALTER、TRUNCATE 等)的操作一旦執行,就不可回滾。指令SET autocommit = FALSE對DDL操作失效。(因為在執行完DDL操作之後,一定會執行一次COMMIT。而此COMMIT操作不受 SETautocommit = FALSE影響。)
② DML(INSERT 、 DELETE 、 UPDATE 、 SELECT等)的操作默認情況,一旦執行,也是不可回滾的。但是,如果在執行DML之前,執行瞭 SET autocommit = FALSE,則執行的DML操作就可以實現回滾。
演示1:DELETE FROM 刪除數據後,恢復數據
SET autocommit = FALSE;
DELETE FROM myemp3;
查詢後數據為空
回滾數據
再次查詢,可以看到恢復數據瞭
演示2:TRUNCATE TABLE,不能回滾數據操作
SET autocommit = FALSE;
TRUNCATE TABLE myemp3;
清空瞭數據
回滾事物
rollback
查詢後數據並沒有恢復
4.效率對比
在速度上,一般來說,drop> truncate > delete。
- 如果想刪除部分數據用delete,註意帶上where子句,回滾段要足夠大;如果想刪除表,當然用drop;
- 如果想保留表而將所有數據刪除,如果和事務無關(不能回滾),用truncate即可;
- 如果和事務有關,或者想觸發trigger,還是用delete;
- 如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數據。
- truncate與drop是DDL語句,執行後無法回滾;delete是DML語句,可回滾。
- truncate隻能作用於表;delete,drop可作用於表、視圖等。
- truncate會清空表中的所有行,但表結構及其約束、索引等保持不變;drop會刪除表的結構及其所依賴的約束、索引等。
- truncate會重置表的自增值;delete不會。
- truncate不會激活與表有關的刪除觸發器;delete可以。
- truncate後會使表和索引所占用的空間會恢復到初始大小;delete操作不會減少表或索引所占用的空間,drop語句將表所占用的空間全釋放掉。
總結
到此這篇關於mysql中drop、truncate與delete區別的文章就介紹到這瞭,更多相關mysql drop、truncate和delete區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MYSQL中Truncate的用法詳解
- MySQL深入詳解delete與Truncate及drop的使用區別
- Java面試題沖刺第四天–數據庫
- 詳解MySQL8.0原子DDL語法
- MySQL之淺談DDL和DML