gpt4 book ai didi

mysql - 错误的 MySQL 更新查询后恢复?

转载 作者:IT老高 更新时间:2023-10-29 00:14:10 26 4
gpt4 key购买 nike

我在表中进行了错误的更新查询。

我忘记在 WHERE 子句中创建一个 id 字段。

这样就更新了我所有的行。

如何恢复?

我没有备份....

最佳答案

这里有两个教训:

  1. 备份数据
  2. 在事务中执行 UPDATE/DELETE 语句,因此如果事情没有按计划进行,您可以使用 ROLLBACK

了解数据库的事务处理(自动提交、显式和隐式)可以使您不必从备份中恢复数据。

事务控制数据操作语句以确保它们是原子的。 “原子”意味着交易要么发生,要么不发生。向数据库发出事务完成信号的唯一方法是使用 COMMITROLLBACK 语句(根据 ANSI-92,遗憾的是不包括用于创建/开始交易,因此它是特定于供应商的)。 COMMIT 应用事务中所做的更改(如果有)。 ROLLBACK 忽略事务中发生的任何操作 - 当 UPDATE/DELETE 语句执行意外操作时非常可取

通常,单个 DML(插入、更新、删除)语句在自动提交事务中执行 - 它们会在语句成功完成后立即提交。这意味着在像您这样的情况下,没有机会将数据库回滚到语句运行之前的状态。当出现问题时,唯一可用的恢复选项是从备份中重建数据(前提是存在备份)。在 MySQL 中,autocommit is on by default for InnoDB - MyISAM 不支持事务。可以使用以下方法禁用它:

SET autocommit = 0

显式事务是指语句包含在显式定义的事务代码块中 - for MySQL, that's START TRANSACTION .它还需要在事务结束时显式制作 COMMITROLLBACK 语句。嵌套事务超出了本主题的范围。

隐式交易与显式交易略有不同。隐式事务不需要显式定义事务。但是,与显式事务一样,它们需要提供 COMMITROLLBACK 语句。

结论

显式事务是最理想的解决方案 - 它们需要一个语句,COMMITROLLBACK,来完成事务,并且清楚地说明正在发生的事情以供其他人阅读如果有需要。如果以交互方式使用数据库,则隐式事务是可以的,但是只有在结果经过测试并完全确定为有效后,才应指定 COMMIT 语句。

这意味着你应该使用:

SET autocommit = 0;

START TRANSACTION;
UPDATE ...;

...并且只有在结果正确时才使用 COMMIT;

也就是说,UPDATE 和 DELETE 语句通常只返回受影响的行数,而不是具体的详细信息。将此类语句转换为 SELECT 语句并检查结果,以确保尝试 UPDATE/DELETE 语句之前的正确性。

附录

DDL(数据定义语言)语句是自动提交的——它们不需要 COMMIT 语句。 IE:表、索引、存储过程、数据库和 View 创建或更改语句。

关于mysql - 错误的 MySQL 更新查询后恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com