当前位置: 首页 > 后端技术 > Java

面试惊喜58:truncate、delete、drop的6大区别

时间:2023-04-02 01:24:58 Java

在MySQL中,可以使用truncate、delete、drop实现表删除,但三者的使用场景和执行效果完全不同。接下来,让我们盘点一下。truncate、delete、drop的区别总结如下表:droptruncatedelete的区别是快和慢,命令分类DDL(数据定义语言)DDL(数据定义语言)DML(数据操作语言)deleteobjectdeletewholeTables和表结构,以及表索引、约束和触发器。只删除表数据,表结构、索引、约束等都会保留。只删除表中的全部或部分数据,表结构、索引、约束等将被保留。删除条件(where)不能用不能用回滚不能回滚不能回滚可以回滚自增初值-resetnotreset下面我们用一个案例来说明他们的区别.在正式开始准备之前,先创建一张用户表和用户测试数据,用于后续演示:CREATETABLE`userinfo`(`id`int(11)NOTNULLAUTO_INCREMENTcomment'number',`name`varchar(250)NOTNULLcomment'name'unique,`balance`decimal(10,2)NOTNULLDEFAULT'0.00'comment'accountbalance',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8;insertintouserinfovalues(1,'张三',1000),(2,'李四',500),(3,'王五',2000),(4,'李六',500);创建的表结构和数据如下图所示:1.删除对象不同。delete和truncate只删除表数据,不删除表结构。删除后的结果如下:我们先将表恢复到初始状态,然后使用truncate进行删除操作。执行结果如下图:将表恢复到初始状态,执行dropdelete语句,执行结果如下图:从上面的结果可以看出delete和truncate只删除表数据,而drop删除的是表结构和表数据。2、支持不同的删除条件。truncate和drop不支持添加where条件,delete支持where条件,如下图:3.命令类别不同。truncate、delete、drop的SQL类别不同。SQL分为以下三类:DDL【数据定义语言】数据定义语言,用来维护存储数据的结构代表指令:create、drop、alter、truncate。DML[DataManipulationLanguage]数据操作语言,用于对数据进行操作,代表指令:insert,delete,update,DML分为单独的DQL,数据查询语言,代表指令是select。DCL[DataControlLanguage]数据控制语言,主要负责权限管理和事务代表指令:grant、revoke、commit。其中delete属于DML,truncate和drop属于DDL。PS:truncate先复制一个新的表结构,然后把旧的表结构和数据一起删除,所以属于数据定义语言DDL,不属于数据操作语言DML。4.回滚支持不同。delete属于DML,支持事务回滚操作,而truncate和drop属于DDL,执行后立即生效,数据不可恢复。接下来我们来验证一下。首先,关闭MySQL的自动事务提交。事务自动提交默认值为“ON”,即开启自动提交,如下图所示:我们使用如下命令关闭自动提交(事务):setautocommit=off;再次查询自动事务提交的设置结果如下:接下来我们演示删除的回滚操作,如下图:从上面的结果可以看出,恢复(回滚)后可以进行delete、truncate和drop之后是不能回滚的,老手可以用同样的方法自己测试后两条sql的执行情况。5.不同的自增初始化delete不会重置自增字段的初始值,如下图:而truncate会重置自增字段的初始值,如下图:6.执行速度不同,delete是逐行执行的,执行时会记录操作日志,以备日后回滚使用,所以delete的执行速度比较慢;而truncate的操作是先复制一个新的表结构,然后将原表整体删除,所以它的执行速度居中,drop最快。总结一下truncate、drop、delete的区别,主要有以下六点:执行速度:drop>truncate>delete。delete和truncate只删除表数据,而drop删除表数据和表结构以及表索引、约束和触发器。delete可以加where条件实现部分数据删除,而truncate和drop不能加where条件删除整体。truncate和drop立即执行,无法恢复;而delete将采取交易并且可以撤回和恢复。truncate会将自增列重置为1,而delete不会重置自增列。truncate和drop是DDL语句,而delete是DML语句。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview