24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel5.8は、マイグレーションスタブの主キーのデフォルトが、increments()からbigIncrements()になった

Posted at

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()どちらを使えばよいのか

INTBIGINTの違い(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/

24
23
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
24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?