我有一个问题,我不太明白。我用Ruby解析一些feed并将它们的内容保存在数据库中。我创建了一个“哈希”列,它是每个帖子网址的md5哈希值。那列是独一无二的,因为我不想发两次。
它实际上很好用:
Mysql::Error: Duplicate entry '28edb7c2b3cd074d226fc4ae37baedd7' for key 'hash'
但脚本此时停止了。我不明白,我知道使用INSERT和PHP总是像魅力一样工作,所以如果有重复的条目它会忽略它并继续。
任何人都可以帮助我吗? “INSERT IGNORE”会创建一个双重条目,还是只是忽略错误消息并继续?
答案 0 :(得分:0)
听起来你的Ruby脚本需要一些exception handling.
答案 1 :(得分:0)
您可以重写查询,以便使用
而不是INSERT INTOREPLACE INTO ...
或
INSERT INTO ... ON DUPLICATE KEY UPDATE
这样尝试插入重复键会更新现有记录而不是错误输出。
<强>更新强>
INSERT IGNORE
如果遇到重复密钥,则不会触及现有数据。 The documentation说:
您可以使用REPLACE而不是INSERT 覆盖旧行。 REPLACE是 与INSERT IGNORE相对应的 处理包含的新行 复制旧的唯一键值 rows:新行用于替换 旧的行而不是 丢弃。
如果使用IGNORE关键字,则会出错 执行INSERT时发生的情况 声明被视为警告 代替。例如,没有IGNORE, 一个复制现有的行 UNIQUE索引或PRIMARY KEY值 该表导致重复键错误 声明中止。同 IGNORE,行仍未插入, 但没有发出错误。
答案 2 :(得分:0)
在PHP中,如果MySQL返回错误,它通常不会杀死PHP脚本。听起来好像在Ruby中并非如此。捕获异常并处理它或使用INSERT IGNORE,在这种情况下MySQL会返回警告而不是错误(除非被告知不要)。
答案 3 :(得分:0)
&#34; INSERT IGNORE&#34;应该防止Ruby退出并且不应该影响您的数据。但是,如果您想知道何时发生这种情况,则必须进行一些错误处理。
begin
DATABASE.query(insertHash)
rescue
puts "Error: " + $!.to_s + "Backtrace >>: " + $@.to_s
end
应该在退出ruby脚本时显示错误。 或者你可以使用它来向用户表明已经有一个条目
希望这有帮助