2015-11-04 7 views
12

ファイルの長さを表す数値を保存しようとしています(4825733517)。列は整数型に設定されます。バリデーションや制限はありません。PostgreSQLデータベースの整数が範囲外です

RangeError: 4825733517 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4 

この値には他の列タイプを使用する必要がありますか?

答えて

22

:limit値はバイト(documentation)の最大列の長さです。

4バイト長の場合、格納できる最大符号付き整数は2,147,483,647で、値は4,825,733,517です。たとえば、8バイトに長整数(bigint PostgreSQL type)を設定すると、9,223,372,036,854,775,807までの符号付きの値を格納できます。

あなたが移行してこれを行うことができますrails generate migration change_integer_limit_in_your_tableようなもので、それを作成し、次のコード:

class ChangeIntegerLimitInYourTable < ActiveRecord::Migration 
    def change 
    change_column :your_table, :your_column, :integer, limit: 8 
    end 
end 
+1

FYIこれは素晴らしい答えであり、*ほとんど*私のために働いた。何が** **仕事をしたのは、すべて同じ構文ですが、 'update_column'ではなく' change_column'でした。私はRails 4.2.6を使用しているので、おそらく "update_column"は廃止予定です。 –

+0

あなたは絶対に正しいです - 'update_column'は単に間違っています。これを最初に書いたとき、他の答えから間違った手がかりを得ているかもしれません。投稿を編集しました。それを指摘してくれてありがとう – p4sh4

0

(レール4.2.4に)あなたは、マイグレーションを使用して、データベース内の列の長さを変更する必要があります。

update_column :my_table, :my_column, :integer, limit: 12 

それはあなたがより大きな整数を格納することができます。

+0

12バイトは完全にやり過ぎであり、また、PostgreSQLで使用可能な数値型に対応していません。 – p4sh4

+0

私は例として12を入れています。彼が保存する必要のある最大の整数さえも知らない。 – Caillou

4

the PostgreSQL documentationによると、整数の範囲は-2147483648から+2147483647です。だからあなたの番号はこのタイプのために大きいです。

bigintを指定するには、列を更新し、パラメータ制限を使用します。タイプintegerの列について

change_column :table, :column, :integer, limit: 8