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

访谈突袭55:delete、drop、truncate有什么区别?

时间:2023-04-01 16:34:19 Java

在MySQL中,有三种删除方式:delete、truncate、drop,三者的用法和使用场景是完全不同的,下面我们来详细了解一下。1.deletedetele可用于删除表中的部分或全部数据。其使用语法如下:deletefromtable_name[where...][orderby...][limit...]PS:[]中的命令为optional可选命令,可以省略。如果我们要删除学生表中数学成绩最高的前3名学生,可以使用如下SQL:deletefromstudentorderbymathdesclimit3;1.1delete实现原理在InnoDB引擎中,delete操作并不是真正删除数据,而是将数据标记为已删除,将其标记为已删除。我们可以通过将MySQL设置为非自动提交模式来测试和验证这一点。非自动提交模式的设置SQL如下:setautocommit=0;然后先删除一条数据,然后使用rollback回滚操作,最后验证我们之前删除的数据是否还存在,如果数据还存在,说明删除数据并没有真正删除,只是将数据标记为已删除.验证SQL及执行结果如下图所示:1.2关于自增列在InnoDB引擎中,使用delete删除所有数据后,不会将自增列重置为初始值,我们可以用如下命令验证:2.truncatetruncate的执行效果和delete类似,也是用来删除表中的所有行数据。它的使用语法如下:truncate[table]table_nametruncatedelete和delete最大的区别在于delete可以使用条件表达式删除部分数据,而truncate不能添加条件表达式,只能删除所有行数据。比如下面的truncate,加上where命令后会报错:2.1truncate的实现原理Truncate看似只删除行数据,其实是一个DDL语句,即DataDefinitionLanguage数据定义语言,用来维护存储数据的结构指令,所以这也不同于删除命令,删除语句属于DML,DataManipulationLanguage数据操作语言,用于对数据进行操作。为什么truncate只删除行数据,不删除列数据(字段、索引等数据)但它是DDL语言?这是因为truncate本质上是新建一个表结构,然后删除原来的表,所以属于DDL语言,不属于DML语言。2.2重置自增列truncate在InnoDB引擎中,自增列会被重置,如下命令所示:3.dropdrop不同于前面两个命令,只删除表的行数据。drop会将整张表的行数据与表结构一起删除,其语法如下:DROP[TEMPORARY]TABLE[IFEXISTS]tbl_name[,tbl_name]其中TEMPORARY表示临时表,一般都是这个命令将被忽略。drop的使用示例如下:数据恢复三个方面的区别:delete可以恢复删除的数据,truncate和drop不能恢复删除的数据。在执行速度方面:drop>truncate>delete。在删除数据方面:drop删除的是整张表,包括行数据、字段、索引等数据,而truncate和drop只删除行数据。在添加条件方面:delete可以使用where表达式添加查询条件,而truncate和drop不能添加where查询条件。重置自增列:在InnoDB引擎中,truncate可以重置自增列,delete不能重置自增列。Summarydelete和truncate可以用来删除表中的行数据,而drop是删除整个表。删除的数据包括所有行数据、字段、索引和其他数据。delete删除的数据可以恢复,truncate和drop是不可恢复的,但是从执行效率上来说,后两种删除方式有很大的优势,所以要根据实际场景选择相应的删除命令。当然,在使用truncate、drop等不可恢复数据的删除方式时也要小心。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview