rails db:migrate実行時にreferencesを使った外部キー制約ができない時の対処法について
個人アプリを制作している時にmySQLでテーブルを作成しようとすると
rails で外部キー制約をかける時にエラーが発生したので、その対処法についてご紹介します。
外部キーの設定をしようとした時に、referencesを使用してrails db:migrateをかけたところエラーが発生しました。1対多と多対多のリレーションでも同じようなエラーが発生します。
class CreatePrJobs < ActiveRecord::Migration[6.0] def change create_table :pr_jobs do |t| t.references :pr, foreign_key: true t.references :job, foreign_key: true t.timestamps end end end
エラー内容
== 20200905041353 CreatePrJobs: migrating ===================================== -- create_table(:pr_jobs) rails aborted! StandardError: An error has occurred, all later migrations canceled: Column `pr_id` on table `pr_jobs` does not match column `id` on `prs`, which has type `bigint(20)`. To resolve this issue, change the type of the `pr_id` column on `pr_jobs` to be :bigint. (For example `t.bigint :pr_id`). Original message: Mysql2::Error: Cannot add foreign key constraint /Users/shunjiro/rails-self-project/Dispatch-site/db/migrate/20200905041353_create_pr_jobs.rb:3:in `change' /Users/shunjiro/rails-self-project/Dispatch-site/bin/rails:9:in `<top (required)>' /Users/shunjiro/rails-self-project/Dispatch-site/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>'
色々と調べると下記が原因とわかりました。
原因
- デフォルトのidカラムはinteger型で作成されるが、rails5.1以降からはbignit型で作成される
- referencesをつかった書き方だと型が合致せず、エラーとなるので揃えてやる必要がある。
対処方法
- referencesをつかう時にidキーをinteger型に変更する
- referencesを使わない外部キー設定にする (参考記事をご参考ください)
2番目の方法を試すとがなぜかダメでした、仕方なく1番目のreferencesを使わない書き方で
rails db:migrateを実行したところ解決しました!
class CreatePrJobs < ActiveRecord::Migration[6.0] def change create_table :pr_jobs do |t| t.integer :pr_id, foreign_key: true t.integer :job_id, foreign_key: true t.timestamps end end end
今までreferencesで設定できていましたが突然できなくなってしまったので、
勝手にバージョンを上げてしまったことが原因だと思います。
参考記事:
qiita.com