1. drop:刪除數(shù)據(jù)庫
方式1:如果要刪除的數(shù)據(jù)庫存在,則刪除成功。如果不存在,則報錯
DROP DATABASE mytest1;
方式2:推薦。 如果要刪除的數(shù)據(jù)庫存在,則刪除成功。如果不存在,則默默結(jié)束,不會報錯。
DROP DATABASE IF EXISTS mytest1;
2. 對比 TRUNCATE TABLE 和 DELETE FROM
相同點:都可以實現(xiàn)對表中所有數(shù)據(jù)的刪除,同時保留表結(jié)構(gòu)。
不同點:
- TRUNCATE TABLE:一旦執(zhí)行此操作,表數(shù)據(jù)全部清除。同時,數(shù)據(jù)是不可以回滾的。
- DELETE FROM:一旦執(zhí)行此操作,表數(shù)據(jù)可以全部清除(不帶WHERE)。同時,數(shù)據(jù)是可以實現(xiàn)回滾的。
3. DDL 和 DML 的說明
① DDL(CREATE 、 DROP 、 ALTER、TRUNCATE 等)的操作一旦執(zhí)行,就不可回滾。指令SET autocommit = FALSE對DDL操作失效。(因為在執(zhí)行完DDL操作之后,一定會執(zhí)行一次COMMIT。而此COMMIT操作不受 SETautocommit = FALSE影響。)
② DML(INSERT 、 DELETE 、 UPDATE 、 SELECT等)的操作默認情況,一旦執(zhí)行,也是不可回滾的。但是,如果在執(zhí)行DML之前,執(zhí)行了 SET autocommit = FALSE,則執(zhí)行的DML操作就可以實現(xiàn)回滾。
演示1:DELETE FROM 刪除數(shù)據(jù)后,恢復(fù)數(shù)據(jù)
SET autocommit = FALSE;
DELETE FROM myemp3;
查詢后數(shù)據(jù)為空
回滾數(shù)據(jù)
再次查詢,可以看到恢復(fù)數(shù)據(jù)了
演示2:TRUNCATE TABLE,不能回滾數(shù)據(jù)操作
SET autocommit = FALSE;
TRUNCATE TABLE myemp3;
清空了數(shù)據(jù)
回滾事物
rollback
查詢后數(shù)據(jù)并沒有恢復(fù)
4.效率對比
在速度上,一般來說,drop> truncate > delete。
- 如果想刪除部分數(shù)據(jù)用delete,注意帶上where子句,回滾段要足夠大;如果想刪除表,當(dāng)然用drop;
- 如果想保留表而將所有數(shù)據(jù)刪除,如果和事務(wù)無關(guān)(不能回滾),用truncate即可;
- 如果和事務(wù)有關(guān),或者想觸發(fā)trigger,還是用delete;
- 如果是整理表內(nèi)部的碎片,可以用truncate跟上reuse stroage,再重新導(dǎo)入/插入數(shù)據(jù)。
- truncate與drop是DDL語句,執(zhí)行后無法回滾;delete是DML語句,可回滾。
- truncate只能作用于表;delete,drop可作用于表、視圖等。
- truncate會清空表中的所有行,但表結(jié)構(gòu)及其約束、索引等保持不變;drop會刪除表的結(jié)構(gòu)及其所依賴的約束、索引等。
- truncate會重置表的自增值;delete不會。
- truncate不會激活與表有關(guān)的刪除觸發(fā)器;delete可以。
- truncate后會使表和索引所占用的空間會恢復(fù)到初始大??;delete操作不會減少表或索引所占用的空間,drop語句將表所占用的空間全釋放掉。
總結(jié)
到此這篇關(guān)于mysql中drop、truncate與delete區(qū)別的文章就介紹到這了,更多相關(guān)mysql drop、truncate和delete區(qū)別內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文地址:https://blog.csdn.net/qq_41684621/article/details/123248516