如何撤消刚刚执行的 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
,然后您可以在查询或会话结束时发出COMMIT
或ROLLBACK
来提交或取消交易。
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 语句?的主要内容,如果未能解决你的问题,请参考以下文章