truncate 和 delete 是 MySQL 中清空表数据的两种方式,平常使用的时候两者好像都差不多,选谁都可以。实际上它们之间是有本质区别的,只有深入理解了它们的差异,在以后的开发中才能根据具体场景运用自如

思考

在讲 truncate 和 delete 的区别之前,不妨先看看下面的问题,带着问题边思考边往下看

问题:如上图所示,红色框(1) 和 红色框(2) 中 id 分别是多少

delete 简述

删除表全部数据或者部分数据,删除的时候是一行一行删除的,所以删除表全部数据时速度比较慢

语句后面可以用 where 过滤待删除的行,比较灵活

语句执行之后会返回本次删除的行数

truncate 简述

删除表全部数据,相当于先 drop table 然后 create table, 速度快语句后面不能接过滤条件语句执行后没有返回值,或者说返回值没有具体的含义

区别

虽然 truncate 和 delete 很相似,但它们有以下不同之处

  • delete 是一行一行的删除数据,truncate 是重新创建表,所以truncate 比 delete 速度快,特别是针对大表

  • 其他表有引用本表列的外键字时,truncate 会执行失败,delete 可以执行

上图中 tb 表的 idb 列是ta表的ida列的外键引用,truncate table ta 执行失败, truncate table ta 能执行成功

  • truncate 是DDL语句,所以不能回滚,delete 是DML语句,可以回滚

  • truncate 返回值无意义, delete 返回本次删除的行数

  • 针对 AUTO_INCREMENT 列,truncate tablename 会把列值重置为起始值,而 delete from tablename 则不会重置(上面的思考题用到了这条知识点)

delete 的优化

前面提到使用 delete 清空大表是速度比较慢,为了保证 delete 语句不会占用大量的时间,可以使用 limit row_count 语句来指定单次删除的最大行数,如果删除的行数大于等于单次删除的最大行数,重复执行 delete 语句直到删除的行数小于单次删除的最大值

答案

有了前面的介绍之后,思考题的答案应该很清晰了

因为表 tt 中 id 列是自增的,truncate 清空表数据会重置自增列,而 delete则不会,所以思考题中 (1) 处的 id 分别是 3、4, (2) 处的 id 分别是 1,2

具体的输出如下图:

delete 会不会锁表_truncate 和 delete相关推荐

  1. delete 会不会锁表_MySQL的insert into select 引发锁表

    上周五HaC我要上线,有一个脚本需要执行,执行前需要备份一个表. 运维大佬:"这个表的备份为什么要这么久,,??" 1秒过去了--2秒过去了-- 期间运营反馈系统出现大量订单超时情 ...

  2. Mysql 会导致锁表的语法

    转自:http://blog.csdn.net/lifaming15/article/details/47904557 最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理 ...

  3. php delete和truncate,TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。...

    TRUNCATE 删除表,无法回退.默认选择为整个表的内容,所以不能加条件. DELETE 删除表,可以回退.可以带where 条件.建议使用delete.但是TRUNCATE 删除表数据比delet ...

  4. insert 锁表 mysql_mysql insert锁机制【转】

    最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...

  5. MySQL锁表了怎么办?

    发生表锁的一些原因 1.锁表发生在insert  update .delete 中    2.锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite 或者 回 ...

  6. mysql锁全表语句_MySql锁表语句

    2019独角兽企业重金招聘Python工程师标准>>> 方便个人记忆: Mysql 5.5 基于innodb 引擎 insert into table1 values select ...

  7. mysql 锁表的情况

    mysql其实在我们使用的时候比较容易造成表被锁的情况,例如以下的几种方式 目前有表 test ,  字段分别有 id,name,age show full PROCESSLIST  查询表的执行情况 ...

  8. 数据库锁表原因及解决思路

    1.锁表发生在insert update .delete 中 2.锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite 或者 回滚 或者退出数据库用户 3. ...

  9. 锁表:MyISAM非聚集索引和InnoDB聚集索引的各种锁表问题

    参考文献 Mysql数据库中的各种锁_张花生的博客-CSDN博客_数据库锁 面试官:MySQL死锁有哪些场景?如何避免? 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存 ...

最新文章

  1. HDU 2149 Public Sale (博弈)
  2. 【Windows10】我的电脑从新装到优化配置
  3. 模型优化:BatchNorm合并到卷积中
  4. java输出一些内容到日志文件
  5. 【离散数学】代数系统的同态(同构)
  6. Linux换行符与windows换行符
  7. 各种隐藏WebShell、创建、删除畸形目录、特殊文件名的方法
  8. 微信小程序后端用python_微信小程序后端开发用python
  9. ad中按钮开关的符号_电工最常用电气元件实物及对应符号
  10. 如何将图片压缩到200K以内,有什么好方法吗?
  11. Git同时配置github和gitee
  12. drupal主题开发_开发人员降低了Drupal的进入门槛
  13. 兆比特每秒和兆字节每秒_Mbps和MB/S一样吗?我们平时经常说的多少M带宽是哪个?...
  14. 杜绝采购欺诈:利用SRM系统监控采购计划
  15. 360校招笔试算法题
  16. 【教程篇】Blender实例教程(一)——制作一个酷炫的三叶草星
  17. RK3568 外接 PCF8563 RTC
  18. Java8-使用stream.sorted()对List排序
  19. 从http协议看百度360大战
  20. 【Java开发】 Mybatis-Plus 02:Mapper-CRUD+自动填充+乐观锁

热门文章

  1. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解
  2. java gt lt_Java运算符,,|,||,^,lt;lt;,gt;gt;,~,gt;gt;gt;
  3. windows10怎么安装python第三方库_怎么在windows下安装python第三方包
  4. python找出矩阵中的马鞍点_矩阵的马鞍点
  5. 全国计算机等级考试和职称考试题库,全国职称计算机等级考试题库及答案
  6. JAVA用JComboBox_java JCombobox和JList的使用
  7. 送30块树莓派PICO 开发板!
  8. 本科、硕士、博士的区别(终极版,太形象了!)
  9. 《管理转型》——读书随笔
  10. 为什么grpc不支持php,带入gRPC:让你的服务同时提供 HTTP 接口