删除

数据库中 drop delete truncate 三者虽然都是删除,就是都有区别。 这当然是一句一废话

作用范围

delete 和 truncate 只删除表的数据不删除表的结构。 drop 删除数据、结构、被依赖的约束、触发器、索引,依赖于该表的存储过程和函数会保留,但状态会变为 invalid。

truncate 只能对表,delete 还可以操作 view。 truncate 删除表中数据,再插入时自增长 id 又会从 1 开始。 delete 删除表中数据,可以加 where 字句。

执行速度

一般来说: drop > truncate > delete

truncate 在功能上与不带 where 子句的 delete 语句相同,均是删除表中的全部行。 但 truncate 比 delete 速度快,且使用的系统和事务日志资源少。 delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。 truncate 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

执行方式

delete 每次从表中删除一行,且是 dml,操作会放到 rollback segement 中,事务提交之后才生效,会激活触发器。 如果有相应的 trigger,执行的时候将被触发。

truncate 一次性删除所有数据,是 ddl,操作立即生效,原数据不放到 rollback segment 中,不能回滚,不激活触发器。

drop 是 ddl,操作立即生效,原数据不放到 rollback segment 中,不能回滚,不激活触发器。

空间

delete 操作不会减少表或索引所占用的空间。 truncate 之后,表和索引所占用的空间会恢复到初始大小。 drop 会将表所占用的空间全释放掉。

其他

对于由 FOREIGN KEY 约束引用的表,不能使用 truncate,而应使用不带 where 子句的 delete。 由于 truncate 不记录在日志中,所以不能激活触发器。

powered by Gitbook该文件修订时间: 2020-04-10 10:05:54

results matching ""

    No results matching ""

    results matching ""

      No results matching ""