MySQL中DELETE和TRUNCATE哪个能回滚?数据删除前必看

 更新时间:2026年11月04日 09:58:11   作者:gh-xiaohe  
还在为数据库操作后无法撤销而烦恼?本文详解COMMIT和ROLLBACK的核心区别,告诉你DELETE和TRUNCATE哪个能回滚,以及MySQL 8.0中DDL原子化如何实现事务回滚,帮你避免数据丢失风险

DCL 中 COMMIT和ROllBACK

COMMIT

COMMIT:提交数据。

一旦执行COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。

ROLLBACK

ROLLBACK:回滚数据。

一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT之后。

对比

相同点:

都可以实现对表中所有数据的删除,同时保留表结构。

不同点:

  • TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
  • DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚的。

DDL 和 DML 的说明

① DDL的操作一旦执行,就不可回滚。指令SET autocommit = FALSE对DDL操作失效。(因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE影响的。)

② DML的操作默认情况,一旦执行,也是不可回滚的。但是,如果在执行DML之前,执行了 SET autocommit = FALSE,则执行的DML操作就可以实现回滚。

案例

COMMIT、DELETE

# 演示:DELETE FROM 
#1)
COMMIT;
#2)
SELECT *
FROM myemp3;
#3)
SET autocommit = FALSE;
#4)
DELETE FROM myemp3;
#5)
SELECT *
FROM myemp3;
#6)
ROLLBACK;
#7)
SELECT *
FROM myemp3;

COMMIT、 ROLLBACK

# 演示:TRUNCATE TABLE
#1)
COMMIT;
#2)
SELECT *
FROM myemp3;
#3)
SET autocommit = FALSE;
#4)
TRUNCATE TABLE myemp3;
#5)
SELECT *
FROM myemp3;
#6)
ROLLBACK;
#7)
SELECT *
FROM myemp3;

MySQL8.0的新特性:DDL的原子化

在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,即DDL操作要么成功要么回滚。

DDL操作回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(该表是隐藏的表,通过show tables无法看到)中,用于回滚操作。

通过设置参数,可将DDL操作日志打印输出到MySQL错误日志中。

分别在MySQL 5.7版本和MySQL 8.0版本中创建数据库和数据表,结果如下:

CREATE DATABASE mytest; # 创建数据库 mytest

USE mytest; # 切换到 mytest 数据库下

CREATE TABLE book1( # 创建 book1 表
book_id INT ,
book_name VARCHAR(255)
);

SHOW TABLES; # 查看当前数据下的表

1)在MySQL 5.7版本中

测试步骤如下:

# 在 mysql5.7 下
DROP TABLE book1,book2;  # 此时删除数据库 book1 和 book2 注意此时没有 book2

SHOW TABLES;

2)在MySQL 8.0版本中

测试步骤如下:

# 在 mysql8.0 下
DROP TABLE book1,book2;  # 此时删除数据库 book1 和 book2 注意此时没有 book2

SHOW TABLES;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • windows下mysql数据库主从配置教程

    windows下mysql数据库主从配置教程

    这篇文章主要为大家详细介绍了windows下mysql数据库主从配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET

    这篇文章主要介绍了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法,结合实例形式较为详细的分析了mysql存储过程创建、调用及变量创建、赋值具体原理、操作技巧与相关注意事项,需要的朋友可以参考下
    2019-12-12
  • mysql实现多表关联统计(子查询统计)示例

    mysql实现多表关联统计(子查询统计)示例

    这篇文章主要介绍了mysql实现多表关联统计(子查询统计),结合具体案例形式分析了mysql多表关联统计的原理、实现方法及相关操作注意事项,需要的朋友可以参考下
    2019-10-10
  • MySQL Range Columns分区的使用

    MySQL Range Columns分区的使用

    Range Columns分区是一种灵活的分区策略,允许基于列值的范围将数据分到不同的分区,本文主要介绍了MySQL Range Columns分区的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 详解Mysql主从同步配置实战

    详解Mysql主从同步配置实战

    这篇文章主要介绍了详解Mysql主从同步实战,实例分析了Mysql主从同步的原理和实现,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • 深入理解mysql各种锁

    深入理解mysql各种锁

    大家好,本篇文章主要讲的是深入理解mysql各种锁,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • MySQL 升级方法指南大全

    MySQL 升级方法指南大全

    通常,从一个发布版本升级到另一个版本时,我们建议按照顺序来升级版本。例如,想要升级 MySQL 3.23 时,先升级到 MySQL 4.0,而不是直接升级到 MySQL 4.1 或 MySQL 5.0。
    2008-01-01
  • 亲手教你SQLyog12.08安装详细教程

    亲手教你SQLyog12.08安装详细教程

    SQLyog 是一个快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库,这篇文章主要介绍了SQLyog12.08安装详细教程,需要的朋友可以参考下
    2023-04-04
  • MySQL登录报错排查:1045、2003错误问题及解决

    MySQL登录报错排查:1045、2003错误问题及解决

    本文详细介绍了MySQL常见报错1145拒绝访问和213无法连接的解决方法,从错误原因出发,通过确认账号密码、重置密码、授权远程访问等步骤解决;通过检查MySQL服务是否启动、查看端口占用情况、关闭防火墙等方式解决;其他常见报错则通过安装系统服务、配置文件修改
    2026-05-05
  • ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

    ERROR 1524 (HY000): Plugin ‘mysql_native

    这篇文章主要介绍了ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded,本文提供了三种解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03

最新评论