Rails Active Record重复输入mysql错误

时间:2013-02-26 01:40:03

标签: mysql ruby-on-rails-3 activerecord

我有一个差不多完成的Rails 3.2.11应用程序,我一直用SQLite3开发。它与SQLite3完美配合。现在我想切换到MySQL进行剩余的开发,但是出了问题。

我的'feed_entries'表的'guid'列上有一个唯一索引。应用程序首先检查是否存在具有相同“guid”的记录,并且如果没有具有相同guid的记录,则仅创建新记录。出于某种原因,guid被更改为特定的数字,因此只保存了一条记录。

这是错误:

ActiveRecord::RecordNotUnique: Mysql::Error: Duplicate entry '2147483647' for key 'index_feed_entries_on_guid' 

以下是试图保存的记录:

FeedEntry Exists (0.3ms)  SELECT 1 AS one FROM `feed_entries` WHERE `feed_entries`.`guid` = 3577996865 LIMIT 1
SQL (0.1ms)  BEGIN
FeedEntry Exists (0.3ms)  SELECT 1 AS one FROM `feed_entries` WHERE `feed_entries`.`guid` = BINARY 3577996865 LIMIT 1
SQL (1.0ms)  INSERT INTO `feed_entries` (`guid`) VALUES (?)  [["guid", 3577996865]]
(1.0ms)  COMMIT
FeedEntry Exists (0.2ms)  SELECT 1 AS one FROM `feed_entries` WHERE `feed_entries`.`guid` = 3643574649 LIMIT 1
SQL (0.1ms)  BEGIN
FeedEntry Exists (0.3ms)  SELECT 1 AS one FROM `feed_entries` WHERE `feed_entries`.`guid` = BINARY 3643574649 LIMIT 1
SQL (1.6ms)  INSERT INTO `feed_entries` (`guid`) VALUES (?)  [["guid", 3643574649]]
(0.8ms)  ROLLBACK

我剥掉了不重要的部分。该表有超过20列,但guid是创建记录时唯一有意义的列,所以为了简洁和易于阅读,我删除了其余的信息。

正如你所看到的,它表明它正在用正确的guid保存它们,但是然后错误显示它正在尝试使用guid 2147483647进行保存。错误之后,该表只有一条记录,尽管它显示了记录是用guid 3577996865保存的,当它从db中获取时,它有错误中显示的guid(2147483647)。我不明白为什么它会将guid转换成这个数字。

也许它与第二个在引导之前说BINARY的Exists声明有关?当我将分支切换为仍然使用SQLite数据库的分支时,每个记录只会尝试保存一个存在查询。

感谢阅读,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我明白了! guid大于4字节'int'字段类型。上限约为21亿(2147483647)。我的解决方案只是关闭第一个数字,因为我不需要它。如果我这样做,我可以将数据类型更改为'bigint'。

以下是一个解释: http://www.idytise.com/blog/returning-2147483647-in-your-mysql-database-table/