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

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

所属分类 数据库

相关标签 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语句不加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语句。##

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

数据库

Linux下Oracle数据库配置日志目录及统一迁移

很多运维人员习惯采用默认安装的方式安装Oracle数据库,而Oracle日志默认放置在/opt目录下,绝大多数Linux环境的大磁盘往往挂载在/home,因此经常会出现磁盘空间不足的情况,采用本文配置可指定并迁移日志

Oracle数据库基础实用维护命令集

Linux系统下的Oracle数据库实用常用的维护命令整理,本文内容偏向运维,主要包含:基础启动重启、表空间维护、数据库角色与用户维护、字符集配置等,并给出各类场景的实例语句

ORA-00257: archiver error. Connect internal only, until freed.

登录Oracle报错 ORA-00257: archiver error. Connect internal only, until freed. 由于归档日志(archive log)已满引起的。

Oracle存储过程Procedure基础语法

存储过程是个好东西,WEB工程在架构阶段会设计很多存储过程,后续在架构中开发需求的时候,反而会直接写SQL完成各项诉求。所以说,这玩意儿略微有那么一点点伪高端。

Oracle数据库MERGE INTO语句条件入库

Oracle 9i版本引入MERGE INTO语句,其主要用于实现条件入库能力,用于解决对于已有数据更新升级的情况,即可实现不存在数据则插入,存在数据则更新的分支判断形式的更新能力

MongoDB通过$lookup实现多表连接查询

对于数据库而言,多表连接操作可以算的上是基本操作,在 MongoDB 通过 $lookup 聚合查询可以实现多表左连接查询,在后续的版本中 $lookup 得到了一系列的增强,实现更为复杂的关联查询

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核