0

我有一个几乎完成的 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 之前说 BINARY 的第二个 Exists 语句有关?当我将分支切换到仍然使用 SQLite 数据库的分支时,它尝试保存的每条记录只有一个 Exists 查询。

感谢您的阅读,非常感谢您的帮助。

4

1 回答 1

0

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

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

于 2013-02-26T03:01:45.203 回答