重庆思庄Oracle、Redhat认证学习论坛
标题:
drop、truncate、delete之间的区别
[打印本页]
作者:
橡皮草帽
时间:
2020-3-6 18:57
标题:
drop、truncate、delete之间的区别
1.drop
Drop table除了在
数据库层面
删除表,还会在
系统层面
删除xxx.ibd,xxx.frm(InnoDB表)或 xxx.MYD,xxx.MYI,xxx.frm (MyISAM)等文件。
drop table if exists table_name可以防止表不存在的报错,但是会有一个warning。
drop table也会
隐式提交
,除了临时表。
2.truncate
逻辑上truncate table和delete from table_name
相似
,但是过程是先drop table,然后在re-create table,如果要清空一个大表的所有数据行,truncate比delete
高效
。
Truncate是一个
DDL
操作,一旦执行会
隐式提交
,这就说明truncate
无法
rollback,所以执行之前
需谨慎
。
如果表被锁住,truncate会
报错
。
如果有外键约束,truncate会
报错
。
对于InnoDB/MyISAM表的auto_increment的列,truncate table之后
可以重新使用
序列值。
truncate table
无法触发
delete相关的触发器。
3.delete
Delete是
DML
操作,如果没有提交,可以rollback。
对于InnoDB/MyISAM表的auto_increment的列,delete table之后
无法重新使用
序列值,但是
重启
之后可以重新使用序列。
Delete from table_name后面
一定要
跟where条件,否则会删除表的
所有
行。
总结:
1.执行效率:drop > truncate > delete
2.在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是
需谨慎
。
3.如果想删除
部分数据
用delete,注意带上where子句,回滚段要足够大。
4.如果想删除
表
,当然用drop。
5.如果想
保留表
而将
所有数据删除
,如果和
事务无关
,用truncate。
6.如果和
事务有关
,或者想
触发
trigger,还是用delete。
7.如果是
整理表内部
的
碎片
,可以用truncate跟上reuse stroage,再
重新
导入/插入数据。
欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2