三者差异
都可以用来删除指定表的所有数据,但三者在删除速度、事务、误删除恢复时的不同,导致在使用上的差异。
delete
1 | 1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中 |
truncate
1 | 1、truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。 |
drop
1 | 1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。 |
总结
1 | 1、在速度上,一般来说,drop> truncate > delete。 |
验证示例
准备工作
使用scott用户,备份EMP表并启用ROW MOVEMENT
1 | -- 备份EMP表 |
drop 表及其表内所有数据
1 | -- 启用ROW MOVEMENT |
delete 删除数据(支持事务)
有where条件的delete语句
1 | -- 1. 查询当前SCN号 |
无where条件的delete语句
1 | SELECT count(1) FROM EMP; -- 12条 SCN 1279180 |
truncate 删除所有表内数据
1 | SELECT count(1) FROM EMP; -- 12条 SCN 1279866 |
oracle flashback相关
删除table的数据闪回依赖RECYCLEBIN
使用DROP TABLE XX PURGE无法闪回;
RECYCLEBIN查询不到(已被清理)的无法闪回;delete的数据闪回依赖UNDO
使用TRUNCATE TABLE XX无法闪回