そもそもテーブル設計が〜云々の話は置いておくとして、
早急にタイトル通りの作業が必要なことがある。
先に結論からいうと
users
テーブルのプライマリキーであるid
をbigint(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_id
をbigint
にするのを忘れた場合、
int
の最大値以上の値は全てint
の最大値で登録される。
補足
最初はRailsのメソッドのみで済ませたいと思っていた。
def up
# usersテーブルのidをbigintに
change_column :users, :id, :bigint
end
これでdata_type
はbigint(20)
になってくれるが、
Auto_increment
の値がNULL
になるという問題がある。
ちなみにAuto_increment
の値がNULL
になると
id
が0
でレコードが登録されてしまう。
2件目以降はプライマリキーのユニーク制約でエラーになる。
この状態から復帰する方法も最初と同じで
ALTER TABLE users MODIFY COLUMN `id` bigint AUTO_INCREMENT;
このSQLを実行すればAuto_increment
の値が正しい値になる。
細かいバージョン情報
Rails 3.2.20
MySQL 5.5.43-37.2-log