MySQL中DELETE和TRUNCATE哪个能回滚?数据删除前必看
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;

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET
这篇文章主要介绍了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法,结合实例形式较为详细的分析了mysql存储过程创建、调用及变量创建、赋值具体原理、操作技巧与相关注意事项,需要的朋友可以参考下2019-12-12
ERROR 1524 (HY000): Plugin ‘mysql_native
这篇文章主要介绍了ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded,本文提供了三种解决方法,具有一定的参考价值,感兴趣的可以了解一下2025-03-03


最新评论