https://blog.csdn.net/ws0513/article/details/49980547
1 delete
-
可用于table和view
-
delete是
DML(data maintain Language,数据维护语言)
,需要手动提交(commit)操作才能生效
,可以通过rollback撤消操作
-
每次从表中删除一行
,并且同时将该行的的删除操作记录在redo和undo
表空间中,以便
进行回滚
(rollback)和重做
操作 -
如果
有相应的 tigger
,执行的时候将被触发
-
可以使用where
-
delete语句
不影响自增字段的值
-
DELETE
操作不会减少 表或索引 所占用的空间
2 truncate
-
只能用于table,
不能用于view
,也不能用于外键(foreignkey )约束引用的表
,而应使用不带 where 子句的 delete 语句
-
truncate是
DDL(data define language,数据定义语言)
,会隐式提交
,所以不能回滚
,不会触发触发器
-
删除表中的所有行,但
表结构及其列、约束、索引等保持不变
,并且将重新设置高水线和所有的索引
-
truncate后,
表 和 索引 所占用的空间
会恢复到初始大小
-
TRUNCATE TABLE
通过释放
存储表数据所用的数据页 来删除数据
,并且只在事务日志中 记录页的释放
,删除操作是不能恢复的
,并且在删除的过程中不会激活与表有关的删除触发器
,执行速度快
。
3 drop
1、drop是DLL(data define language,数据定义语言)
,会隐式提交
,所以不能回滚
,不会触发触发器
。
2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。
3、DROP则删除表结构和数据
,触发器
,索引
,依赖于该表的存储过程/函数 将被保留
,但其状态会变为:invalid
。
4 总结:
-
在
速度上
,一般来说,drop> truncate > delete -
在使用drop和truncate时一定要注意,
虽然可以恢复,但为了减少麻烦,还是要慎重
-
如果想
保留表
而将所有数据删除
,如果和事务无关
,用truncate即可
-
如果
和事务有关
,或者想触发trigger
,还是用delete
-
如果是
整理表内部的碎片
,可以用truncate跟上reuse stroage
,再重新导入/插入数据