语句作用
- DELETE:
DELETE 语句删除满足条件的 row 数据
- TRUNCATE:
TRUNCATE 语句一次性地从表中删除所有的数据
- DROP:
DROP 语句删除表结构以及数据
执行方式
- DELETE 语句
执行删除的过程是每次从表中删除一行,同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操
- TRUNCATE 语句
一次性地删除所有数据,不会将删除操作记录记入日志保存,不能恢复的,不会激活与表有关的删除触发器
- DROP 语句
删除表结构及所有数据,同时删除表的结构所依赖的约束、触发器、索引,依赖于该表的存储过程/函数将保留变为 invalid 状态
表和索引所占空间
- DELETE 语句
不会减少表或索引所占用的空间
- TRUNCATE 语句
表和索引所占用的空间会恢复到初始大小
- DROP 语句
表所占用的空间全部释放
作用对象
- DELETE 语句
可以是 table(表)和 view(视图)
- TRUNCATE 语句
仅可以是 table(表)
- DROP 语句
可以是 table(表)和 view(视图)
DML 和 DLL
- DML(data manipulation language)数据操纵语言
- DDL(data definition language)数据库定义语言
DELETE 语句属于 DML,可以带 WHERE 条件,操作会被放到 rollback segment 中,事务提交后才生效
TRUNCATE 语句和 DROP 语句属于 DDL,操作立即生效,隐式提交,不可回滚(因此应当谨慎使用)
DELETE 和 TRUNCATE
DELETE 语句和 TRUNCATE 语句都能实现删除表中的全部数据(DELETE 语句不加 WHERE 条件时)
- TRUNCATE 语句
速度快,使用的系统和事务日志资源少。
因为 DELETE 语句每次删除一行,在事务日志中为所删除的每行记录一项。
- TRUNCATE 语句
通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
删除表中的所有行,表结构及其列、约束、索引等保持不变,但是新行标识所用的计数值重置为该列的种子。
如果想保留标识计数值,请改用 DELETE 语句。
比如 MYSQL 的自增值使用 TRUNCATE 语句删除后新行会变成 1,而 DELETE 语句删除后新行依旧继续 +1。
如果想触发 trigger,需要使用 DELETE 语句,因为 TRUNCATE 语句不会激活与表有关的删除触发器。
其他
- DROP > TRUNCATE > DELETE。
- 使用 DROP 语句和 TRUNCATE 语句需谨慎。
- 删除部分数据用 DELETE 语句,注意带上 WHERE 子句。
- 删除表,当然用 DROP 语句。
- 保留表而将所有数据删除,事务无关,用 TRUNCATE 语句,效率高。
- 保留表而将所有数据删除,和事务有关或想触发 trigger,用 DElETE 语句。##