drop, delete, truncate的区别
删除内容
drop直接删除整个表, 包含表结构和数据;
truncate删除表中数据, 表结构及其列, 约束, 索引等不变, 再插入时自增id又从1开始;
delete删除表中数据, 可以结合where来约束范围.
删除过程
delete是从表中一行一行地删除, 事务提交后才生效, 并在事务日志中为所删除的每一行都记录, 以便进行回滚操作.
truncate则是一次性地从表中删除所有的数据, 通过释放存储表数据所用的数据页来删除数据, 事务日志中只记录页的释放, 不把单独的删除操作记录记入日志中, 删除的行不能恢复, 并且在删除的过程中不会激活与表有关的删除触发器, 执行速度快.
drop操作立即生效, 不能回滚.
删除后的空间
truncate删除表后, 表和索引所占用的空间会恢复到初识大小, 但是delete删除操作不会减少表和索引所占用的空间, drop则会将表所占用的空间全部释放掉.
应用范围
truncate只能对表, delete可以对表和视图.
执行速度
drop > truncate > delete
使用选择
在没有备份的情况下, 谨慎使用drop和truncate, 要删除部分数据行可以采用delete结合where, 并且回滚段要足够大.
如果想保留表而将表中数据删掉, 并与事务无关, truncate即可实现. 如果与事务有关, 还是选用delete.
有外键约束引用的表, 不能使用truncate, 而是使用不带where子句的delete.