You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel迁移报错:外键约束格式错误(errno:150)求助

解决Laravel迁移中Foreign key constraint is incorrectly formed错误

你遇到的这个errno: 150报错确实挺磨人的,虽然你已经检查了无符号和类型一致,但还有几个容易忽略的点可以排查:

  • 关联表的迁移顺序不对:Laravel是按迁移文件名的时间戳顺序执行的,如果你的sample_migration迁移文件比关联表(比如subjects)的迁移更早执行,那创建外键的时候关联表还不存在,自然会报错。去看看两个迁移文件的前缀时间戳,确保关联表的迁移先跑。

  • 字段类型的大小不匹配:你用了increments('id')生成主键,这个在Laravel里是无符号INT类型,但如果关联表的主键用的是bigIncrements('id')(现在Laravel新版本默认是这个),那你这边的subject_id就得改成bigInteger('subject_id')->unsigned(),INT和BIGINT是不能互作外键的,这个细节很容易漏。

  • 外键约束的语法有误:看你贴的代码最后是$tabl...,应该是打错了吧?正确的外键定义得完整,比如:

$table->foreign('subject_id')
      ->references('id')
      ->on('subjects') // 这里要写对关联表的真实名称,注意单复数
      ->onDelete('restrict'); // 可选,但语法不能缺胳膊少腿
  • 表的字符集/排序规则不一致:如果sample_migration和关联表的字符集(比如一个是utf8,一个是utf8mb4)或者排序规则不一样,也会触发这个错误。可以检查两个迁移文件里有没有单独设置字符集,或者数据库默认配置是否统一。

给你个完整的正确示例参考:

首先是关联表(比如subjects)的迁移(要先执行):

Schema::create('subjects', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->timestamps();
});

然后是sample_migration的迁移:

Schema::create('sample_migration', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('subject_id')->unsigned();
    $table->string('content');
    $table->timestamps();

    // 正确的外键约束
    $table->foreign('subject_id')
          ->references('id')
          ->on('subjects')
          ->onDelete('cascade');
});

按这个顺序排查下来,应该能找到问题所在啦。

内容的提问来源于stack exchange,提问作者roo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:29:51