mysql奇怪的“重复输入”错误

时间:2011-06-11 11:41:08

标签: mysql ruby

我有一个问题,我不太明白。我用Ruby解析一些feed并将它们的内容保存在数据库中。我创建了一个“哈希”列,它是每个帖子网址的md5哈希值。那列是独一无二的,因为我不想发两次。

它实际上很好用:

Mysql::Error: Duplicate entry '28edb7c2b3cd074d226fc4ae37baedd7' for key 'hash'

但脚本此时停止了。我不明白,我知道使用INSERT和PHP总是像魅力一样工作,所以如果有重复的条目它会忽略它并继续。

任何人都可以帮助我吗? “INSERT IGNORE”会创建一个双重条目,还是只是忽略错误消息并继续?

4 个答案:

答案 0 :(得分:0)

听起来你的Ruby脚本需要一些exception handling.

答案 1 :(得分:0)

您可以重写查询,以便使用

而不是INSERT INTO
REPLACE INTO ...

INSERT INTO ... ON DUPLICATE KEY UPDATE

这样尝试插入重复键会更新现有记录而不是错误输出。

有关详细信息,请参阅herehere

<强>更新

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脚本时显示错误。 或者你可以使用它来向用户表明已经有一个条目

希望这有帮助