如何撤消刚刚执行的 mysql 语句?

Posted

技术标签:

【中文标题】如何撤消刚刚执行的 mysql 语句?【英文标题】:How can I undo a mysql statement that I just executed? 【发布时间】:2011-02-24 12:27:26 【问题描述】:

如何撤消最近执行的 mysql 查询?

【问题讨论】:

这听起来像是“糟糕,我刚刚删除了数据库”。 也需要帮助。我刚刚清空了由代码错误引起的所有表 ... 很容易成为一个糟糕的 WHERE 子句! 那个链接可能对percona.com/blog/2012/02/20/…有帮助 【参考方案1】:

如果将表类型定义为 InnoDB,则可以使用事务。您需要设置AUTOCOMMIT=0,然后您可以在查询或会话结束时发出COMMITROLLBACK 来提交或取消交易。

ROLLBACK -- will undo the changes that you have made

【讨论】:

【参考方案2】:

您只能在交易期间这样做。

BEGIN;
INSERT INTO xxx ...;
DELETE FROM ...;

那么你可以:

COMMIT; -- will confirm your changes

或者

ROLLBACK -- will undo your previous changes

【讨论】:

【参考方案3】:

基本上:如果您正在执行事务,只需执行回滚即可。否则,您无法“撤消” MySQL 查询。

【讨论】:

【参考方案4】:

对于某些指令,例如 ALTER TABLE,这在 MySQL 中是不可能的,即使是事务(1 和 2)。

【讨论】:

【参考方案5】:

您可以停止正在处理的查询

通过=> show processlist;找到查询进程的Id;

然后 => 杀死 id;

【讨论】:

【参考方案6】:

如果您不仅需要撤消上一个查询(尽管我知道您的问题实际上只指出了这一点),因此如果交易可能无法帮助您,您需要为此实施解决方法:

在提交查询之前复制原始数据,并根据两个表中必须相同的唯一 ID 按需将其写回;您的回滚表(带有未更改数据的副本)和您的实际表(包含应该“撤消”的数据)。 对于具有许多表的数据库,一个包含原始数据的结构化转储/副本的单个“回滚表”会比每个实际表使用一个更好。它将包含实际表的名称、行的唯一 ID,以及在第三个字段中以任何所需格式清楚表示数据结构和值的内容(例如 XML)。根据前两个字段,第三个字段将被解析并写回实际表。带有时间戳的第四个字段将有助于清理此回滚表。

尽管在事务中“回滚”,但 SQL 方言中没有真正的撤消(如果我错了,请纠正我 - 也许现在有一个),我猜这是唯一的方法,你必须自己写代码。

【讨论】:

以上是关于如何撤消刚刚执行的 mysql 语句?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 apache 强制执行 SSL (https)?如何撤消此操作?

如何查看mysql中执行sql语句

如何查看mysql执行过的语句

如何看mysql执行的sql语句

如何查看mysql执行的所有以往 sql 语句历史命令

顺序执行多条sql,一条执行失败则所有都执行失败;例如第一条成功,第二条失败的话,第一条也失败!急!