撤消mysql UPDATE命令

Nav*_*een 16 mysql

我试图在MySQL服务器上进行更新,并意外忘记添加一个应该编辑一行的额外WHERE子句.

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

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

请告诉我,我可以做些什么来解决这个问题.

Jer*_*acs 11

如果你提交了你的交易,那么是时候把这个备份搞砸了,抱歉.但这就是备份的用途.我曾经做过一次这样的事情.


use*_*017 10

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


Mic*_*ant 7

没有.

尽管如此,你可以很高兴你已经掌握了这种学习经验,并为你现在如何改变你的习惯而大大减少它再次发生的可能性感到自豪.你现在可以成为'大师',可以教幼小的幼崽,并引用经过实战训练的经验.


Usa*_*jad 6

只有一件事你现在可以改正,那就是你的习惯,它会在未来帮助你。我知道这是一个老问题,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
Run Code Online (Sandbox Code Playgroud)