新闻资讯

新闻资讯 通知公告

SQL:drop、truncate、delete之间的区别

编辑:009     时间:2020-03-07

数据库就是用来存储数据的,所有的数据都根据业务分门别类,存储在对应的表中,我们经常会对数据进行删除操作,接下来风哥为大家介绍drop与truncate区别,truncate与delete区别,drop与delete区别。


1.drop与truncate与delete功能与特点

01.Drop的特点
Drop table除了在数据库层面删除表,还会在系统层面删除xxx.ibd,xxx.frm(InnoDB表)或 xxx.MYD,xxx.MYI,xxx.frm (MyISAM)等文件;
drop table if exists table_name可以防止表不存在的报错,但是会有一个warning;
drop table也会隐式提交,除了临时表;


02.Truncate的特点
•逻辑上truncate table和delete from table_name;相似,但是过程是先drop table,然后在re-create table,如果要清空一个大表的所有数据行,truncate比delete高效;
•Truncate是一个DDL操作,一旦执行会隐式提交,这就说明truncate无法rollback,所以执行之前需谨慎
•如果表被锁住,truncate会报错;
•如果有外键约束,truncate也会报错;
•对于InnoDB/MyISAM表的auto_increment的列,truncate table之后可以重新使用序列值;
•truncate table无法触发delete相关的触发器;


03.Delete的特点
Delete是DML操作,如果没有提交,可以rollback;
对于InnoDB/MyISAM表的auto_increment的列,delete table之后可以无法重新使用序列值,但是重启之后可以重新使用序列;
Delete from table_name后面一定要跟where条件,否则会删除表的所有行;


总结:
01.执行效率:drop > truncate > delete
02.在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。
03.如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;如果想删除表,当然用drop;如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;如果和事务有关,或者想触发trigger,还是用delete;如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。


2.truncate与delete区别

在mysql和oracle数据库中delete与truncate都是可以用来对数据进行删除操作,但是二者又有些不同。
风哥为大家介绍以下几个区别:


01.truncate与delete区别一:
根据sql语言分类来说,delete属于DML语言,也就是数据操作语言,而truncate属于DDL语言,也就是数据定义语言。


02.truncate与delete区别二:
delete不仅可以删除表中的数据,还可以删除基于真实表创建的视图中的数据。truncate则只能删除表中的数据,不能作用于视图。


03.truncate与delete区别三:
由于delete删除数据涉及到事务处理,会涉及到缓存,当数据非常大时,有可能缓存不够用,所以这时使用delete删除数据可能达不到删除到的目的,而且速度特别慢。当涉及到大批量的数据时,truncate就非常适合,因为他不涉及到缓存,所以速度特别快,效率也高。


04.truncate与delete区别四:
在数据库删除数据时,delete可以根据需要进行删除,也就是delete可以结合where条件进行精确的删除某一条数据,而truncate则不能支持where子句,如果作用于表,则是直接删除表所有数据。


05.truncate与delete区别五:
delete删除表时,会涉及到事务处理,也就是可以支持事务提交,回滚。所谓事务就是支持数据一致性,原子性,持久性,隔离性。当使用delete删除表数据时,首先它不会真正删除,而是会将删除的数据放入一个缓存区,可以通过回滚,从而恢复数据。但是使用truncate删除表中数据时,truncate不涉及事务处理,所以被truncate删除的数据是不可恢复的。


06.truncate与delete区别六:
在对于一些存在关联关系的表,使用delete删除数据时,可以运用sql的业务逻辑顺序来进行达到删除数据的目的。例如表A与表B存在一对多的关系,表A中id为主键,并且id在表B中是作为表B的外键。要删除数据,这时不能直接删除表B,而应该先删除表A在进行删除表B,这样就达到目的。而truncate不能删除对于由外键约束的表,它达不到删除该表的目的。


07.truncate与delete区别七:
有时候对数据操作可能涉及到触发器,用delete删除数据时则有可能会激活触发器,进行一些操作。而truncate是不存在触发器的处理的。


总结:delete和truncate的应用场景
01.delete适用于数据量较小,对于性能要求不是很高的情况下,可以采用delete加上where子句进行删除数据。
02.如果需要考虑事务提交,回滚操作的,适合适用delete进行删除数据。
30.当涉及到大量数据,而且是不需要回滚的情况下,并且要求速度快,效率高,则可以使用truncate来删除数据。


备注:本文转自 http://www.fgedu.net.cn/3318.html

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐