delete、drop和truncate的区别
数据库中删除的三种语句:
-
Delete:用于删除表中的行,可以删除某一行,也可以在不删除表的情况下删除所有的行。
-
Drop:用于删除表,将表的结构、属性、索引全部删除。
-
Truncate:用于删除表内的数据,仅删除表内数据,不删除表本身。
数据库中删除语句的相同点:
-
truncate和不带where子句的delete都能删除表中的全部行。
-
truncate和delete只删除表数据,保留表结构。
-
truncate和drop都是DDL。
数据库中删除语句的不同点:
-
truncate table比 delete table速度快,且使用的系统和事务日志资源少。
-
delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
truncate table 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。 -
truncate和drop都是DDL操作立即生效(隐式提交),原数据不放到rollback segment中,不能回滚。
delete是DML会先将所删除的数据缓存到rollbacksegment中,事务提交之后才生效。 -
truncate table是删除内容,释放空间,但不删除定义。
delete table是删除内容不删除定义,不释放空间。
drop table是删除内容和定义,释放空间 -
表和索引所占空间:
truncate操作后,这个表和索引所占的空间会恢复到初始大小。
delete操作不会减少表或索引所占用的空间。
drop语句将表所占用的空间全部释放。 -
应用范围:
truncate只能对table。
delete可以是table和view。 -
truncate和delete只删除数据,drop则删除整个表(结构和数据)。
-
truncate与不带where的delete :只删除数据,而不删除表的结构(定义)。drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
-
在速度上drop>truncate>delete。
总结
表是一本书,delete是根据条件撕下书的内容,truncate是把书的内容撕下来烧了,drop是把书烧了。