【发布时间】:2013-02-26 01:40:03
【问题描述】:
我有一个几乎完成的 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 保存,当它从数据库中获取它时,它具有错误中显示的 guid (2147483647)。我不明白为什么要将 guid 转换为那个数字。
也许它与在 guid 之前说 BINARY 的第二个 Exists 语句有关?当我将分支切换到仍然使用 SQLite 数据库的分支时,它尝试保存的每条记录只有一个 Exists 查询。
感谢您的阅读,非常感谢您的帮助。
【问题讨论】:
标签: mysql ruby-on-rails-3 activerecord