我在表中进行了错误的更新查询。
我忘记在 WHERE 子句中创建一个 id 字段。
这样就更新了我所有的行。
如何恢复?
我没有备份....
最佳答案
这里有两个教训:
ROLLBACK了解数据库的事务处理(自动提交、显式和隐式)可以使您不必从备份中恢复数据。
事务控制数据操作语句以确保它们是原子的。 “原子”意味着交易要么发生,要么不发生。向数据库发出事务完成信号的唯一方法是使用 COMMIT 或 ROLLBACK 语句(根据 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 .它还需要在事务结束时显式制作 COMMIT 或 ROLLBACK 语句。嵌套事务超出了本主题的范围。
隐式交易与显式交易略有不同。隐式事务不需要显式定义事务。但是,与显式事务一样,它们需要提供 COMMIT 或 ROLLBACK 语句。
显式事务是最理想的解决方案 - 它们需要一个语句,COMMIT 或 ROLLBACK,来完成事务,并且清楚地说明正在发生的事情以供其他人阅读如果有需要。如果以交互方式使用数据库,则隐式事务是可以的,但是只有在结果经过测试并完全确定为有效后,才应指定 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/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee