Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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/

fuubit
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした