19

我试图在 MySQL 服务器上进行更新,但不小心忘记添加一个额外的 WHERE 子句,该子句应该编辑一行。

由于我的错误,我现在编辑了 3500 多行。

我可能有备份,但自上次备份以来我做了很多工作,我只是不想因为 1 个错误查询而浪费这一切。

请告诉我有什么办法可以解决这个问题。

4

4 回答 4

12

只是一个想法-您可以将备份还原到新数据库,然后根据以前的数据进行跨数据库查询以更新该列吗?

于 2012-06-06T20:58:52.163 回答
12

如果你提交了你的事务,是时候清理备份了,抱歉。但这就是备份的用途。我自己曾经做过类似的事情……曾经。

于 2012-06-06T20:59:16.557 回答
11

没有。

尽管如此,您仍会为自己获得了这种学习经验而感到高兴,并为您现在将如何改变习惯以大大减少再次发生这种情况的机会而感到自豪。现在,您将成为“主人”,可以教导幼崽并引用实际经过实战考验的经验。

于 2012-06-06T21:09:50.647 回答
7

你现在能做的只有一件事就是改正你的坏习惯,它会在未来帮助你。我知道这是一个老问题,OP 一定已经吸取了教训。我只是为其他人发布它,因为我今天也吸取了教训。

因此,我应该运行一个查询,该查询应该更新大约 50 条记录,然后MySQL返回 THIS 48500 row(s) affected,由于一个愚蠢的条件错误,这让我有点心脏病发作WHERE:D

所以这里是学习:

  1. 在运行它之前总是检查你的query两次,但有时它不会有帮助,因为你仍然会犯那个愚蠢的错误。
  2. 由于第 1 步并不总是有帮助,因此最好DB在运行任何会影响数据的查询之前备份您的数据。
  3. 如果您因为数据库很大并且需要时间而懒惰创建备份(就像我在运行那个愚蠢的查询时一样),那么至少使用 TRANSACTION,我认为这是一种轻松战胜灾难的好方法。从现在开始,这就是我对影响数据的每个查询所做的:

我启动Transaction,运行Query,然后检查结果是否正常。如果结果还可以,那么我只是简单地COMMIT改变,否则我只是为了克服灾难ROLLBACK

START TRANSACTION;
  UPDATE myTable
  SET name = 'Sam'
  WHERE recordingTime BETWEEN  '2018-04-01 00:00:59' AND '2019-04-12 23:59:59'; 
ROLLBACK;
-- COMMIT; -- I keep it commented so that I dont run it mistakenly and only uncomment when I really want to COMMIT the changes
于 2019-04-12T01:19:12.157 回答