delete truncate drop 区别

在我学习的过程中,我依次学到了这三个内容:delete,truncate ,drop 都是跟删除有关的,为了增强记忆,来写一写他们的区别:
delete
删除数据
语法:delete from table where …

如果不加where就是将表中的数据全部删除,delete是DML语言,执行过后需要commit一下,才会生效。没有commit之前可以用rollback恢复数据;
delete只会删除表里的数据,不会对表结构造成影响。
delete每删除一行,都会在事务日志里面记录一条数据,truncate不会,它通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

truncate
语法:truncate table 表名

DDL语言一旦执行,直接提交,无法还原; 只是删除表中的数据,不会删除表结构(触发器,索引,约束)
与不带where的delete语句功能相同,但truncate删除的时候不记录单行的删除记录,比不带where的delete的速度更快,所占用的系统资源和事务日志资源更少
这是一个快速清空数据的方法,针对能够自动递增的列,可以重置归零,如果想继续保留计数值,请使用delete TRUNCATE TABLE
不能激活触发器,因为该操作不记录各个行删除

drop
语法:drop table 表名;

属于DDL语言,直接删除表,连同数据加结构,依赖于该表的存储过程/函数将保留,但是变为invalid状态。一旦执行,直接提交

但在oracle 10g之后,提供了闪回技术(flashback),可以利用闪回技术还原表

flashback table 表名 to begin drop;

若想永久删除表:drop table 表名 purge
清空recyclebin:purge recyclebin;

建议:若想删除,使用drop;若想清空表数据,使用truncate;若想删除部分数据,使用delete
小心使用drop与truncate,尤其是在 没有备份的时候
delete语句是DML语言,这个操作会放在rollback segement中,事物提交后才生效;如果有相应的触发器
(trigger),执行的时候将被触发。
truncate、drop是DDL语言,操作后即 生效,原数据不会放到rollback中,不能回滚,操作不会触发trigger。
如果跟事务无关可以使用truncate,如果和事务有关、又或者想触发 trigger,还是用delete

猜你喜欢

转载自blog.csdn.net/enbaoIT/article/details/88072998
今日推荐