一、Delete与Truncate清空表用法
- Delete
语法:DELETE FROM table_name [WHERE Clause]
当未指定where条件时为清空表中全部数据。 - Truncate
语法:TRUNCATE [TABLE] table_name
清空表中数据,同时重新初始化自增字段,即重新开始计数。
二、用法区别
- truncate用法删除整个表数据的同时重置自增字段自增值,而delete用法只删除整个表数据,不改变当前自增字段的自增值。(比如含自增id字段表的最后一条记录id为10,truncate后下一条插入的记录id将为1,而delete后下一条插入记录id将为11)
- truncate清空表效率比delete清空表效率高。
- truncate是DDL语言,执行后自动提交;delete是DML语言,执行后不会自动提交。
- delete操作能够回滚,truncate操作不能回滚。
- delete操作将触发on delete trigger,但truncate不会触发trigger。
- delete由于可使用where限定删除范围,因此delete相比truncate更灵活。
- delete操作会记录每一条删除记录进日志,而truncate只记录一次数据释放操作。
三、效率差异产生的原因
- 在有where限定的情况下,delete是检索整个数据表符合where限定条件的记录进行删除,因此会逐条检查,并检查边删除。
现在没有了where,但是delete的逻辑没有大变化,仍然是一行一行的检索后删除,只不过这时不用进行限定条件判断。
而Truncate是直接删除整个表的数据,相当于先删除表后重新创建,因此truncate命令是需要表的drop权限的。 - 以下是摘自oracle官方文档的内容