当前位置: 首页 > 科技观察

删除、删除和截断之间有什么区别?你知道吗?

时间:2023-03-16 20:32:10 科技观察

在MySQL中,有三种删除方式:delete、truncate、drop,三者的用法和使用场景是完全不同的,下面我们来详细了解一下。1.deletedetele可用于删除表中的部分或全部数据。它的使用语法如下:PS:[]中的命令是可选的,可以省略。如果我们要删除student表中数学成绩最高的前3名学生,可以使用如下SQL:deletefromtable_name[where...][orderby...][limit...]1.1delete的实现原理是在InnoDB引擎中,delete操作并不是真正删除数据,而是将数据标记为删除,标记为已删除状态。我们可以通过将MySQL设置为非自动提交模式来测试和验证这一点。设置非自动提交模式的SQL如下:deletefromstudentorderbymathdesclimit3;然后先删除一条数据,然后使用rollback回滚操作,最后验证我们之前删除的数据是否还存在,如果数据还存在,说明delete并没有真正删除数据,只是标记了删除的数据。验证SQL及执行结果如下图所示:1.2关于自增列在InnoDB引擎中,delete所有数据被删除后,自增列不会被重置为初始值。我们可以用下面的命令来验证一下:2.truncatetruncate的执行效果和delete差不多。它还用于删除表中的所有行数据。它的使用语法如下:truncate[table]table_nametruncate与delete最大的区别在于delete可以使用条件表达式删除部分数据,而truncate不能添加条件表达式,只能删除所有行数据。比如下面的truncate添加where命令后,会报错:2.1truncate实现原理Truncate看似只删除行数据,其实是一个DDL语句,即DataDefinitionLanguage,用于维护存储数据的结构指令,所以这也与删除命令不同。delete语句属于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等不可恢复数据的删除方式时也要小心。