Laravel5.8で既存のマイグレーションファイルに外部キーを追加しようとしたら、
Cannot add foreign key constraint
なエラー
これは、主キーのデフォルトが、increments()
からbigIncrements()
になったため。
参考:
https://laravel.com/docs/5.8/upgrade
https://laraveldaily.com/be-careful-laravel-5-8-added-bigincrements-as-defaults
解決方法
下記のどちらかを行う
- 元のマイグレーションを
bigIncrements()
からincrements()
にする。 - 外部キーカラムを
integer()
ではなくbigInteger()
にする。
ところで、bigIncrements()
のincrements()
どちらを使えばよいのか
INT
とBIGINT
の違い(MySQL)
INT
INT(符号付き)の範囲は-2147483648〜2147483647。
INT(符号なし)の範囲は0〜4294967295。
BIGINT
BIGINT(符号付き)範囲は-9223372036854775808から9223372036854775807。
BIGINT(符号なし)範囲は0から18446744073709551615。
参考:https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html
- INTは21億までの値を格納可能
- BIGINTは20桁までの大きな数値まで値を格納可能
- BIGINTではなくINTを使用すると、ディスク容量を削減できる。
- 外部キーとインデックスに対して使用された場合、インデックスサイズが減り、インデックスが使用されたときのパフォーマンスが向上する。
- まず主キーと外部キーを考えて、テーブルに21億行以上格納するつもりがなければ、INT (つまり、主キーに
increments()
)を使うと良さそう。
参考:
http://ronaldbradford.com/blog/bigint-v-int-is-there-a-big-deal-2008-07-18/