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,再重新导入/插入数据。
|