点击上方 一个优秀的废人,选择 设为星标

优质文章,及时送达

来源 | blog.csdn.net/qq_39390545/article/details/107144859

咱们常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。

一、从执行速度上来说

drop > truncate >> DELETE

二、从原理上讲

1、DELETE

DELETE from TABLE_NAME where xxx
  • DELETE 属于数据库 DML 操作语言,只删除数据不删除表的结构,会走事务,执行时会触发 trigger;

  • 在 InnoDB 中,DELETE 其实并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记为已删除,因此 delete 删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会被释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以重用这部分空间(重用 → 覆盖)。

  • DELETE 执行时,会先将所删除数据缓存到 rollback segement 中,事务 commit 之后生效;

  • delete from table_name 删除表的全部数据,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;

  • 对于 delete from table_name where xxx 带条件的删除,不管是 InnoDB 还是 MyISAM 都不会释放磁盘空间;

  • delete 操作以后使用 optimize table table_name 会立刻释放磁盘空间。不管是 InnoDB 还是 MyISAM 。所以要想达到释放磁盘空间的目的,delete 以后执行 optimize table 操作。

示例:查看表占用硬盘空间大小的 SQL 语句如下:(用 M 做展示单位,数据库名:csjdemo,表名:demo2)

select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') as table_size    from information_schema.tables       where table_schema='csjdemo' AND table_name='demo2';

然后执行空间优化语句,以及执行后的表 Size 变化:

optimize table demo2

再看看这张表的大小,就只剩下表结构 size 了。


  • delete 操作是一行一行执行删除的,并且同时将该行的的删除操作日志记录在 redo 和 undo 表空间中以便进行回滚(rollback)和重做操作,生成的大量日志也会占用磁盘空间。

2、truncate

Truncate table TABLE_NAME
  • truncate:属于数据库 DDL 定义语言,不走事务,原数据不放到 rollback segment 中,操作不触发 trigger。

「执行后立即生效,无法找回」

  • truncate table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM 。truncate table 其实有点类似于 drop table 然后 creat, 只不过这个 create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近 drop table 的速度;

  • truncate 能够快速清空一个表。并且重置 auto_increment 的值。

但对于不同的类型存储引擎需要注意的地方是:

1. 对于 MyISAM,truncate 会重置 auto_increment(自增序列)的值为 1。而 delete 后表仍然保持 auto_increment。

2. 对于 InnoDB,truncate 会重置 auto_increment 的值为 1。delete 后表仍然保持 auto_increment。但是在做 delete 整个表之后重启 MySQL 的话,则重启后的 auto_increment 会被置为 1。

也就是说,InnoDB 的表本身是无法持久保存 auto_increment。delete 表之后 auto_increment 仍然保存在内存,但是重启后就丢失了,只能从 1 开始。实质上重启后的 auto_increment 会从 SELECT 1+MAX (ai_col) FROM t 开始。

  • 小心使用 truncate,尤其没有备份的时候,如果误删除线上的表,记得及时联系中国民航,订票电话:400-806-9553

3、drop

Drop table Tablename
  • drop:属于数据库 DDL 定义语言,同 Truncate;

「执行后立即生效,无法找回」

  • drop table table_name 立刻释放磁盘空间 ,不管是 InnoDB 和 MyISAM; drop 语句将删除表的结构被依赖的约束 (constrain)、触发器 (trigger)、索引 (index);  依赖于该表的存储过程 / 函数将保留,但是变为 invalid 状态。

  • 小心使用 drop ,要删表跑路的兄弟,请在订票成功后在执行操作!订票电话:400-806-9553

「可以这么理解,一本书,delete 是把目录撕了,truncate 是把书的内容撕下来烧了,drop 是把书烧了」

-END-

如果看到这里,喜欢这篇文章的话,请帮点个好看。微信搜索「一个优秀的废人」,关注后回复「 1024」送你一套完整的 java 教程(包括视频)。回复「 电子书」送你全编程领域电子书 (不只Java)。

drop table可以删除多张表吗_delete、truncate、drop 有啥区别?该怎么选择?相关推荐

  1. drop table可以删除多张表吗_python全球疫情分析,告诉你海外疫情到底有多严峻 | 附290行代码...

    点击蓝字关注!设置星标!每天都有进步 作者:数据小斑马 | 数据分析师 CSDN博客专家 本文通过python,对全球疫情进行分析,除了总结疫情现状外,重点讲解 串联爬虫.数据库和数据分析的基础知识点 ...

  2. mysql 命令执行drop 命令_(笔记)Mysql命令drop table:删除数据表

    drop table命令用于删除数据表. drop table命令格式:drop table ; 例如,删除表名为 MyClass 的表: mysql> drop table MyClass; ...

  3. Mysql命令drop table:删除数据表

    drop table命令用于删除数据表. drop table命令格式:drop table ; 例如,删除表名为 MyClass 的表: mysql> drop table MyClass; ...

  4. Java连接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash

    准备工作 1.创建Java的Maven项目 创建好的目录结构如下: 另外注意junit的版本,最好不要太高,最开始笔者使用的junit4.12的,发现运行的时候会报错.最后把Junit的版本改成4.7 ...

  5. 只知道删除单张表的数据?不知道删除多张表的数据?

    一些废话 可能在某某一天,你在删除表的数据的时候,不想一张表一张表的去删除,想把两个表的数据同时删除:然后你就会去搜索,然后你就很有很有很有很有可能会看到 me 的这篇优质(呸!!!)文章了~ 嗯,没 ...

  6. 表的插入、更新、删除、合并操作_20_通过表关联删除多张表

    通过表关联删除多张表 需求描述 需求:删除dept表里deptno和temp相同的记录,但数据不可再恢复. 解决方法:这里通过DELETE FROM A,B FROM tableNAME A JOIN ...

  7. php删除一张表数据的时候 把另一张表的数据也删除,剔除第一张表的数据时,修改第二张表的相关字段的数值...

    删除第一张表的数据时,修改第二张表的相关字段的数值 表xf xf_id vip total 1 1 10 2 1 100 3 2 80 4 3 50 表vip vip jifen 1 1000 2 5 ...

  8. delete from删除几张表关联和mysql几种连接查询总结

    delete from删除几张表关联和mysql几种连接查询总结 一.delete from删除几张表关联 ① 在多表连接时删除数据(错误删除示例): delete from sys_role_men ...

  9. oracle 一次删除多张表

    转载自:https://zhidao.baidu.com/question/184478164.html 1.首先要知道要删除的表名,写如下语句: select 'DROP TABLE'||TABLE ...

最新文章

  1. Btree(B-树)---C++
  2. android 根据文本计算行数,ios 获取Text行数和每行显示的内容
  3. 每天一个设计模式,工厂方法模式(Factory Method)
  4. java怎么调用存储函数_java中调用存储过程或存储函数的方法
  5. C语言再学习 -- printf、scanf占位符
  6. Sandy引擎学习笔记:摄影机
  7. Oracle GoldenGate 12c 新特性
  8. [jQuery基础] jQuery对象 -- CSS相关
  9. 求助下 Ubuntu 15.10(64 位)下安装 pyspider 下的问题 - V2EX
  10. 安工大计算机学院肖维民,安工大路由器实验报告.docx
  11. linux ll以编码格式_在Linux中文件的编码及对文件进行编码转换
  12. iphone圆点怎么弄出来_iPhone 秒变“坦克大战”游戏机,666!
  13. 2017年度优秀软件工程造价师等评选通知
  14. 解放双手,CSDN博客支持公众号自动同步!
  15. pq 中m函数判断嵌套_PowerQuery 进阶之 M 函数学习
  16. mybatis缓存引起的问题
  17. oracle 保留池,oracle的内存结构之--查看内存信息+保留池和循环池(摘自文平书)...
  18. Oculus/VR新手入门指南
  19. ZB级的大数据探索与应用实践【附PPT】
  20. NatureProtocols:使用MicrobiomeAnalyst统计和功能分析微生物组数据

热门文章

  1. [转]Git,SVN的优缺点及适合的范围,开源项目?公司项目?
  2. 华为机试HJ93:数组分组
  3. android定义 task,Android Gradle 自定义Task 详解
  4. mysql 文章 字段设计_在mysql数据库中,文章表设计有啥好的思路
  5. 鸿蒙会取代emui,华为称自家手机运行鸿蒙系统正在推进 未来会取代安卓吗?
  6. lua脚本移植到linux平台,如何将lua移植到arm平台的linux内核
  7. java和python和php_Java、Python和PHP三者的区别
  8. jbod ugood 磁盘驱动状态_NTFS磁盘读写工具Mounty免费版
  9. 盒子模型代码_果冻公开课第五课:五分钟理清盒模型的前世今生
  10. 做了8年软件测试的我,是如何从菜鸟快速成长为测试工程师的?