如何在MySQL中使用TRUNCATE和DELETE清空表的区别是什么?

浅宇吖_9331

浅宇吖_9331

2026-07-08

693人浏览

原创

truncate不能带where条件而delete可以,这是最直观区别;truncate是ddl操作,隐式提交且不可回滚,会重置auto_increment;delete是dml操作,支持事务回滚和条件删除,不重置自增计数器。

如何在mysql中使用truncate和delete清空表的区别是什么?

TRUNCATE 不能带 WHERE 条件,DELETE 可以

这是最直观、也最容易踩坑的区别。写 TRUNCATE TABLE users WHERE status = 'inactive' 会直接报错 ERROR 1064 (42000) —— 语法不支持。而 DELETE FROM users WHERE status = 'inactive' 是完全合法的。

如果你只是想清空整张表,DELETE FROM users 看似和 TRUNCATE TABLE users 等价,但行为差异巨大,不能简单替换。

  • TRUNCATE 只能整表清空,没有“选择性”概念
  • DELETE 不加 WHERE 是危险操作,线上应避免裸用
  • 需要按条件清理时,唯一选项是 DELETE(或分区裁剪等替代方案)

TRUNCATE 会重置 AUTO_INCREMENT,DELETE 不会

假设一张 users 表当前最大 id 是 1200,自增计数器已到 1201。执行 TRUNCATE TABLE users 后,下一条插入的记录 id 就是 1;而 DELETE FROM users 后,下一条插入仍是 1201。

这个差异直接影响业务逻辑:比如依赖自增 ID 连续性做分页、导出编号、或下游系统缓存了“最大 ID 值”,TRUNCATE 就会导致跳变。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 若需保留自增值,只能用 DELETE,再手动 ALTER TABLE users AUTO_INCREMENT = 1201
  • TRUNCATE 的重置是隐式行为,无法关闭
  • 某些归档场景反而依赖 TRUNCATE 的重置特性,比如每日重跑的中间表

TRUNCATE 是 DDL,DELETE 是 DML,事务表现完全不同

TRUNCATE 在 InnoDB 中本质是“删表重建”,属于 DDL 操作,会隐式提交当前事务。哪怕你写了 BEGIN; TRUNCATE TABLE logs; ROLLBACK;,ROLLBACK 也无效 —— 数据已经没了。

DELETE 是标准 DML,支持完整事务控制:BEGIN; DELETE FROM logs WHERE created_at 能彻底回滚。

  • 需要原子性兜底(比如清空 + 插入新数据必须一起成功/失败)时,只能用 DELETE
  • TRUNCATE 执行后立刻释放磁盘页空间,DELETE 只标记删除,空间不会立即回收
  • 权限上,TRUNCATE 需要 DROP 权限,不是 DELETE 权限 —— 很多应用账号没开,会报 ERROR 1142 (42000): TRUNCATE command denied

大表清空时,TRUNCATE 快但风险更隐蔽

TRUNCATE 几乎瞬间完成,因为它不走行扫描、不写 undo log、不触发触发器;DELETE 大表可能卡几秒甚至几分钟,还可能阻塞其他查询。

但快不等于安全:TRUNCATE 不产生 binlog 行事件(只记 ddl event),主从延迟感知弱,且无法被 pt-archiver 或类似工具捕获用于审计。

  • 备份未就绪前,别信“TRUNCATE 很快所以我先跑一下试试”
  • 有 ON DELETE 触发器?TRUNCATE 完全绕过,逻辑丢失
  • 外键约束表上,TRUNCATE 可能失败(需先禁用或删外键),DELETE 则受约束检查
实际选哪个,不看速度,看你要不要条件、要不要回滚、要不要触发器、要不要保持自增连续性——这些点漏掉一个,线上就容易出事。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2153

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1319

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

775

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2932

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4908

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1119

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5171

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4562

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6014

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习