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?

[Laravel] migrationで外部キー設定にハマった

Posted at

これはなに

  • 業務上で得た知識をメモるだけ
  • 他人が読む前提で書いていません

何にハマったのか

  • 既存テーブルに外部キーを設定したいが以下エラーが出てしまう
foreign key (`<外部キー設定カラム>`) references `<参照先テーブル名>` (`id`):
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.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html for correct foreign key definition.

Please refer ~ って書いてあるリンク死んでるんだけど、、、

疑ったところ

  • 色んな人が記事書いていたので怪しそうなところを確認
    • indexが貼られていない?
      • 貼ってるよ
    • DBのエンジンが違う?
      • どちらもInnoDBだよ
    • 参照先テーブルと外部キー設定するテーブルのcharsetが違う?
      • どちらもutf8mb4だよ
      • ローカルのDB構築はStagingデータが元だったのでめっちゃ疑ってしまい余計に時間食った
    • 参照先テーブルとカラム定義が違う?
      • ここでした
      • 小手先でそれっぽく定義合わせたつもりだったけど漏れがあった
      • 参照先は10桁・符号なしだったが外部キーカラムは11桁・符号ありだった

確認コマンド

  • テーブルのエンジン・charset確認
show create table project_contracts;
  • DBのcharset確認(character_set_serverがサーバーのデフォルト文字セット)
show variables like 'character_set_server';
  • InnoDBエラー確認
show engine innodb status;

修正結果

    public function up(): void
    {
        Schema::table('<外部キー設定テーブル名>', function (Blueprint $table) {
            // カラムの桁数を10桁に変更し符号なしを付与
            // 参照先テーブルがunsignedIntegerなので合わせないと外部キーが設定できない
            $table->unsignedInteger('<外部キー設定カラム>')->comment("xxxxID")->change();
            
            // 外部キー制約を追加
            $table->foreign('<外部キー設定カラム>')
                ->references('id')
                ->on('<参照先テーブル名>');
        });
    }

まとめ

  • 外部キー設定する際は定義が一致しているかちゃんと確認しないとダメなんだな〜
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?