Ruby
ActiveRecord
Rails5

Rails5で外部キー制約つけようとしたらエラーになった話

Rails5(5.1.3)にてマイグレーションファイルでt.foreign_key使って外部キー制約つけようとしたら、Mysql2::Error: Cannot add foreign key constraintとだけ出てマイグレーションができなくなった話です。(普段ならreferences使ってるので問題なかったのですが、今回は使えない場面でした)

シーン

以下の2つのテーブルがあるとしてarticles.user_idに対して、外部キー制約(users.id)をつけようと試みました。

create_table :users do |t|
  t.string :name, null: false

  t.timestamps
end
create_table :articles do |t|
  t.string :title, null: false
  t.integer :user_id, null: false, index: true
  t.foreign_key :users, column :user_id         # ここでエラー

  t.timestamps
end

問題点

t.integerで通常作成されるカラムはINT型ですが、Rails5からidカラムはBIGINT型に変わったようなので、型が合わなくなったようです。

修正すべきところ

t.integerlimit: 8のオプションを加えるとBIGINT型のカラムが作成できます。

(修正後)
create_table :articles do |t|
  t.string :title, null: false
  t.integer :user_id, null: false, index: true, limit: 8
  t.foreign_key :users, column :user_id

  t.timestamps
end

型の不一致と警告してくれるときと、ただ何も言わず落とされる時があってハマった。

参考文献