重庆思庄Oracle、Redhat认证学习论坛
标题:
truncate与delete区别
[打印本页]
作者:
橡皮草帽
时间:
2020-3-6 22:22
标题:
truncate与delete区别
在mysql和oracle数据库中delete与truncate都是可以用来对数据进行删除操作,但是二者又有些不同。
根据sql语言分类来说,delete属于
DML
语言,也就是
数据操作语言
,而truncate属于
DDL
语言,也就是
数据定义语言
。
delete不仅
可以删除表中的数据
,还可以
删除基于真实表创建
的视图中的
数据
。truncate则
只能删除表中的数据
,
不能作用于视图
。
由于delete删除数据涉及到事务处理,会涉及到缓存,当数据非常大时,有可能缓存不够用,所以这时使用delete删除数据可能达不到删除到的目的,而且速度特别慢。当涉及到大批量的数据时,truncate就非常适合,因为他不涉及到缓存,所以速度特别快,效率也高。
在数据库删除数据时,delete可以根据需要进行删除,也就是delete可以结合where条件进行精确的删除某一条数据,而truncate则不能支持where子句,如果作用于表,则是
直接删除表所有数据
。
delete删除表时,会涉及到事务处理,也就是可以支持事务提交,回滚。所谓事务就是支持数据一致性,原子性,持久性,隔离性。当使用delete删除表数据时,首先它不会真正删除,而是会将删除的数据放入一个缓存区,可以通过回滚,从而恢复数据。但是使用truncate删除表中数据时,truncate不涉及事务处理,所以被truncate删除的数据是不可恢复的。
在对于一些存在关联关系的表,使用delete删除数据时,可以运用sql的业务逻辑顺序来进行达到删除数据的目的。例如表A与表B存在一对多的关系,表A中id为主键,并且id在表B中是作为表B的外键。要删除数据,这时不能直接删除表B,而应该先删除表A在进行删除表B,这样就达到目的。而truncate不能删除对于由外键约束的表,它达不到删除该表的目的。
有时候对数据操作可能涉及到触发器,用delete删除数据时则有可能会激活触发器,进行一些操作。而truncate是不存在触发器的处理的。
总结:
1.delete适用于数据量
较小
,对于
性能要求不是很高
的情况下,可以采用delete加上where子句进行删除数据。
2.如果需要考虑
事务提交
,
回滚操作
的,适合适用delete进行删除数据。
3.当涉及到
大量数据
,而且是
不需要回滚
的情况下,并且
要求速度快
,
效率高
,则可以使用truncate来删除数据。
欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2