0

SQLite3 で開発してきたほぼ完成した Rails 3.2.11 アプリがあります。SQLite3 で完全に動作します。残りの開発のために MySQL に切り替えたいのですが、何か問題が発生しています。

「feed_entries」テーブルの「guid」列に一意のインデックスがあります。アプリは最初に、同じ 'guid' を持つレコードが存在するかどうかを確認し、同じ guid を持つレコードが存在しない場合にのみ新しいレコードを作成します。何らかの理由で、GUID が特定の番号に変更されているため、1 つのレコードのみが保存されます。

エラーは次のとおりです。

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 の場合、データベースからフェッチすると、エラー (2147483647) に示されている GUID が表示されます。GUIDをその数値に変換する理由がわかりません。

GUID の前に BINARY と書かれている 2 番目の Exists ステートメントと何か関係があるのでしょうか? ブランチを SQLite db を引き続き使用するブランチに切り替えると、保存しようとするレコードごとに 1 つの 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 に答える