📖SQL语句中DELETE、TRUNCATE和DROP的区别

发布: 2017-09-29
热度: 44
趋势: 44
权重: 0
🎯

当我们需要清理或删除某张表或数据的时候,通常会有采取DELETE、TRUNCATE、DROP的任意一种形式的SQL语句,他们之间作用的对象不同所产生的效果也各不相同,包括执行结果和效率

语句作用

  1. DELETE:
    DELETE 语句删除满足条件的 row 数据
  2. TRUNCATE:
    TRUNCATE 语句一次性地从表中删除所有的数据
  3. DROP:
    DROP 语句删除表结构以及数据

执行方式

  1. DELETE 语句
    执行删除的过程是每次从表中删除一行,同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操
  2. TRUNCATE 语句
    一次性地删除所有数据,不会将删除操作记录记入日志保存,不能恢复的,不会激活与表有关的删除触发器
  3. DROP 语句
    删除表结构及所有数据,同时删除表的结构所依赖的约束、触发器、索引,依赖于该表的存储过程/函数将保留变为 invalid 状态

表和索引所占空间

  1. DELETE 语句
    不会减少表或索引所占用的空间
  2. TRUNCATE 语句
    表和索引所占用的空间会恢复到初始大小
  3. DROP 语句
    表所占用的空间全部释放

作用对象

  1. DELETE 语句
    可以是 table(表)和 view(视图)
  2. TRUNCATE 语句
    仅可以是 table(表)
  3. 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 语句不会激活与表有关的删除触发器。

其他

  1. DROP > TRUNCATE > DELETE。
  2. 使用 DROP 语句和 TRUNCATE 语句需谨慎。
  3. 删除部分数据用 DELETE 语句,注意带上 WHERE 子句。
  4. 删除表,当然用 DROP 语句。
  5. 保留表而将所有数据删除,事务无关,用 TRUNCATE 语句,效率高。
  6. 保留表而将所有数据删除,和事务有关或想触发 trigger,用 DElETE 语句。##
当前文章暂无讨论,留下脚印吧!
大纲
  • 语句作用
    • 执行方式
    • 表和索引所占空间
    • 作用对象
  • DML 和 DLL
    • DELETE 和 TRUNCATE
  • 其他
提交成功,请等待审核通过后全面展示!

发表评论

昵称
邮箱
链接
签名
评论

温馨提示:系统将通过浏览器临时记忆您曾经填写的个人信息且支持修改,评论提交后仅自己可见,内容需要经过审核后方可全面展示。

选择头像