1
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?

【Laravel】【MySQL8】外部キー制約名が長くて怒られた話

Posted at

外部キー制約名について、個人的に勉強になったので忘備録がてら投稿します💻


やりたいこと

hogehoge_fugafuga_piyopiyo_hogerahogera テーブルを作成するとき、
foo_bar_foo_bar テーブルのidを外部キーとして持たせたい。

Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
    $table->id();

    $table->foreignId('foo_bar_foo_bar_id')
        ->constrained()
});

マイグレートする

マイグレートしたらSQLエラー発生
なにやら名前が長いらしい..

SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name 'hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_foreign' is too long

調べてみるとMySQLで作成できる制約名は64文字がMAXみたい。
テーブル名も最大64文字とのこと。
スクリーンショット 2024-11-06 1.51.14.png

外部キーを作成するとき、Laravelはよしなに「テーブル名」と「外部キーとなるカラム名」を結合して外部キー制約名を命名しにいくので、長めになってしまう時があるよ!

`hogehoge_fugafuga_piyopiyo_hogerahogera` + `foo_bar_foo_bar_id` + `_foreign` = 65文字

結論

index()で、64文字以内の好きな名前をつける。

Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
    $table->id();

    $table->foreignId('foo_bar_foo_bar_id')
        ->constrained()
        ->index('hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk');
});

マイグレートが通り、index_nameがちゃんとつく(DBクライアントツールで確認)
スクリーンショット 2024-11-01 13.40.37.png

ちなみに、index()はカラム修飾子だと思ってたのでconstrained()の前に書いてみましたが、これだと正しく動いてくれません。なぜ...?(有識者の方教えてください🙇)

Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
  $table->id();

	$table->foreignId('foo_bar_foo_bar_id')
        ->index('hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk')
	    ->constrained()
});

備考

foreignの第二引数に名前を渡せそうかも。
ですが、Laravelさん曰くこれは冗長な書き方らしいです。

Schema::create('hogehoge_fugafuga_piyopiyo_hogerahogera', function (Blueprint $table) {
    $table->unsignedBigInteger('foo_bar_foo_bar_id');
    $table->foreign('foo_bar_foo_bar_id', 'hogehoge_fugafuga_piyopiyo_hogerahogera_foo_bar_foo_bar_id_fk')
	    ->references('id')
	    ->on('foo_bar_foo_bar');
});

1
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
1
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?