0
0

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 3 years have passed since last update.

【Laravel】 外部制約キーを migration で設定しようとしたらエラー

Last updated at Posted at 2020-03-15

何が起きたか

hoge テーブルに users テーブルのid で外部制約キーを設定しようと migrate 実行時にエラーが

結論

bigIntegerで制約を付けたいカラムにを定義しないと、 migrationファイル作成時に記述されている $table->id() と型が異なってしまう

知っていればつまづくポイントにもならないと思いますが、自分の備忘録として・・・

エラーパターン

migration

// users テーブル

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('login_id');
        $table->string('password');
        $table->timestamps();
    });
}
// hoge テーブル

public function up()
{
    Schema::create('hoge', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->integer('user_id')->unsigned();
        $table->timestamps();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

エラー内容

エラーを見ると
Cannot add foreign key constraint

...エラーが起きたのどこだろ

MySqlの場合下記実行でエラー内容の詳細が見れる。

SHOW ENGINE INNODB STATUS;

status カラムの LATEST FOREIGN KEY ERROR とある部分を見ると

Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.

エラーに従って usersidhogeuser_id をチェックすると
users.idBIGINT
hoge.user_idINT

型が違った

修正内容

hoge テーブルの user_id 定義を変更してやればOK

// hoge テーブル 修正後

public function up()
{
    Schema::create('hoge', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->bigInteger('user_id')->unsigned();
        $table->timestamps();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?