読者です 読者をやめる 読者になる 読者になる

Rails MySQLでintegerカラムに潜む罠

Ruby Rails

Railsでinteger型のカラムにinsertする際にハマったのでメモ。

以下の様なテーブルがあったとする。

  user_id, integer
  point, integer

これに対してActiveRecordを用いてintegerのmax値を超えたデータをinsertする。

  PointList.create(:user_id => 2, :point => 2247483647
  => #

と一見正常に見えるがデータをロードしてみるとintegerのmax値に丸められてしまっている。

  PointList.all
  [#]

この問題はpointカラムにvalidates_uniqueness_ofを設定している場合でもvalidate時点ではintegerを超えた値でも、
既に登録されているデータと値が異なる場合valid?がtrueとなる。

この為重複したデータがMySQL内に存在することになってしまう。

Ruby on Rails 2.3.8とMySQL5.1.48で確認しました。
SQLiteではこの問題は発生しませんでした。