drop、truncate和delete的区别
一、delete
1、delete是DML,执行delete操作时(删除一行数据),可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录,并且同时将删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作
2、 需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。
二、truncate(慎用或者不用)
1、truncate是DDL,会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,
除非使用reuse storage。
2、truncate会隐式提交,不需要commit提交,不会记录日志,所以执行速度很快,不能回滚,不会触发触发器。
3、truncate只能作用于表,不能作用于视图,不能作用于带有外键的表,不能用于参与了索引视图的表。
4.truncate相当于重新建表,数据库表属性信息同样会更新,这个表和索引所占用的空间会恢复到初始大小。
truncate table xxx ; 可以(粗略的)看做:
drop table xxx;
create table xxx () ;
这两个命令。
三、DROP (慎用)
1、drop是DDL,不需要commit提交,所以执行速度很快,不能回滚,不会触发触发器,
会删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。
区别:
(1)删除表数据的区别
DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除
的过程中不会激活与表有关的删除触发器。执行速度快。
DROP会删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态
truncate与不带where的delete :只删除数据,而不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会
变为:invalid。
(2)表和索引所占空间。
TRUNCATE :表和索引所占用的空间会恢复到初始大小,
DELETE: 不会减少表或索引所占用的空间。
DROP: 语句将表所占用的空间全释放掉。
(3)运行速度
drop > truncate > delete
(4)应用范围。
TRUNCATE 只能对TABLE;
DELETE可以是table和view
DROP 可以删除表、视图、索引、过程、函数等