truncate、delete、drop区别
语法:
- truncate table 表名
- delete from 表名
- drop table 表名
应用范围:
- truncate 只能对表,且不能用于参与了索引的表,不能用于外键约束引用的表
- delete 可以是表或视图
区别:
- truncate和delete只删除表中的数据,保留数据表结构
- drop则删除整张表。被依赖的约束(constrain)、触发器(trigger)、索引(index)也都被删除;依赖于该表的存储过程/函数将保留,但是变为invalid状态
删除速度:
- drop > truncate > delete
- delete的效果有点像将mysql表中所有记录一条一条删除到删完
- truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表
可恢复性:
- delete删除的数据存储在系统回滚段rollback segment中,需要的时候,数据可以回滚恢复
- truncate删除的数据不可恢复,删除速度非常快
是否触发trigger:
- delete是dml,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发
- truncate和drop是ddl,操作立即生效;操作不触发trigger
对自增字段的影响:
- delete之后,重新插入数据,带有自增字段的列仍保留原来的最大值
- truncate之后,从头开始计数
建议:
- 想删除整张表,用drop
- 想保留表,而删除所有数据:1.和事务无关,用truncate 2.和事务有关,或者想触发trigger,用delete
- 想删除部分数据行,用delete,注意带上where子句