2016-05-17 2 views
0

私は、mysqlのmedium intの上限値2147483647に達したアプリケーションで自動インクリメントされたIDフィールドを持っています。更新されたIDカラムがまだRangeErrorで失敗しています

change_column :my_model_names, :id, :integer, limit: 8, auto_increment: true 

:4

私はBIGINT IDを作るために、移行を作成した限度で::整数2147483656のActiveRecord ::型の範囲外である:

例外RangeError:私は次のエラーを受け取りますこれが働いているように見えます - ここでのmysqlコマンドラインからのフィールドの説明である:

+-----------------------------+---------------+------+-----+---------+----------------+ 
| Field      | Type   | Null | Key | Default | Extra   | 
+-----------------------------+---------------+------+-----+---------+----------------+ 
| id       | bigint(20) | NO | PRI | NULL | auto_increment | 
+-----------------------------+---------------+------+-----+---------+----------------+ 

レールコンソールでは、私は列が正しいWHに見えることがわかります私はMyModelName.columns照会エン:

2.2.2 :045 > MyModelName.new.save 
RangeError: 2147483657 is out of range for ActiveRecord::Type::Integer with limit 4 

それは:

2.2.2 :045 > MyModelName.columns[0] 
> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::Column:0x007f98bf6d6640 @strict=true, @collation=nil, @extra="auto_increment", @name="id", @cast_type=#<ActiveRecord::Type::Integer:0x007f98bf6e7490 @precision=nil, @scale=nil, @limit=8, @range=-9223372036854775808...9223372036854775808>, @sql_type="bigint(20)", @null=false, @default=nil, @default_function=nil> 

をそれははるかに私が保存しようとしている値を超えているが、私はまだ同じエラーを取得することを制限= 8と範囲を持っていますレコードが保存されていなくても、オートインクリメントの値が更新されていることに注意するのは興味深いことです。私は再びしようとすると、ID値がインクリメントされます。

RangeError: 2147483658 is out of range for ActiveRecord::Type::Integer with limit 4 

バージョン情報

activerecord (4.2.5.1) 
mysql2 (0.3.18) 
+0

愚かな質問:あなたのレールコンソールを再ロードしようとしましたか? –

+0

はい - 私は今まで私のdevコンピュータ全体を再起動しました。それでも同じエラーが発生します(メモリに格納されている値をリセットすることは除きます)。 –

答えて

0

も同様にサイズを変更する必要が同様の外部キーにこの値をpropogate任意の更新/ after_saveコールバックがあります?

+0

いいえ、そのようなものはありません。私は今作成した単純化されたプロジェクトで問題を再現することができなかったので、mysqlアダプタやアクティブレコードのメソッドをオーバーライドするカスタム関数があると考えています。私はチームの別の開発者にチェックインするつもりです –

+0

cool。あなたが問題を見つけることを願っています。私はあまりにも学ぶようにスレッドを更新:) –

+0

私は最大のIDを持っていた私のテストマシン上で誤ったレコードを持っていたが、我々は実際に私たちの生産データにその多くのレコードを持っていないので、 IDフィールドをbigintにする必要はありませんでした。なぜ新しいIDを取得できなかったのかは分かりません。私はマイグレーションが失敗した最初の数回、私はそれを実行し、何らかの形でdbフィールドまたはautoincrementを破損したと思っています。か何か。恥ずかしい! –

関連する問題