LoginSignup
0
0

More than 5 years have passed since last update.

Rails3&MySQL5の組み合わせでidをintからbigintに切り替える

Posted at

そもそもテーブル設計が〜云々の話は置いておくとして、
早急にタイトル通りの作業が必要なことがある。

先に結論からいうと
usersテーブルのプライマリキーであるidbigint(20)にしたい場合。

class ChangeUserIdFromIntToBigInt < ActiveRecord::Migration
  def up
    # usersテーブルのidをbigintに
    connection.execute(
      <<-EOS.strip_heredoc
        ALTER TABLE users
        MODIFY COLUMN `id` bigint AUTO_INCREMENT;
      EOS
    )

    # 関連テーブルのuser_idをbigintに
    change_column :authentications, :user_id, :bigint
    change_column :content_stars, :user_id, :bigint
    ### ...以下略... ###
  end
end

完全にただのSQL。
でもこれしか方法がわからなかった。

なお、外部キーのuser_idbigintにするのを忘れた場合、
intの最大値以上の値は全てintの最大値で登録される。

補足

最初はRailsのメソッドのみで済ませたいと思っていた。

def up
  # usersテーブルのidをbigintに
  change_column :users, :id, :bigint
end

これでdata_typebigint(20)になってくれるが、
Auto_incrementの値がNULLになるという問題がある。

ちなみにAuto_incrementの値がNULLになると
id0でレコードが登録されてしまう。
2件目以降はプライマリキーのユニーク制約でエラーになる。
この状態から復帰する方法も最初と同じで

ALTER TABLE users MODIFY COLUMN `id` bigint AUTO_INCREMENT;

このSQLを実行すればAuto_incrementの値が正しい値になる。

細かいバージョン情報

Rails 3.2.20
MySQL 5.5.43-37.2-log
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0