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

网址

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

同类其他

数据库

Oracle存储过程Procedure基础语法

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

SPOOL导出指定格式的Oracle数据文件

为了方便数据的处理,或者本身有特殊的数据格式要求,我们可以使用SPOOL命令导出Oracle数据库数据数据文件,并指定格式,高效且强大...

Orcale定时任务管理dbms_job

在Oracle中创建、运行、维护定时任务,配合存储过程可以完成很多特定的业务诉求,dbms_job提供了使用的API功能便于我们实现更为细致的定时任务管理

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

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

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

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

MySql数据库设置表名大小写不敏感

MySql数据库在Linux系统下默认数据库名与表名严格区分大小写,一般情况下我们创建表名习惯使用全小写,如果遇到某些从Windows服务器迁移过来的数据库可能需要设置大小写不敏感

选择个人头像

昵称

邮箱

QQ

网址

评论提示

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