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
相关产品推荐
相关产品推荐

