Laravel外键约束创建失败:errno:150错误排查求助
Laravel外键约束创建失败排查方案
以下是针对你遇到的errno:150外键约束错误的排查方向和解决办法:
核心排查点
字段类型完全匹配问题
外键字段必须和关联表的主键字段类型完全一致,包括是否为无符号(unsigned)。你的party_id和employee_id用的是unsignedBigInteger,需要确认parties.id和employees.id的类型:- 执行数据库命令
DESCRIBE parties;和DESCRIBE employees;,查看id字段的类型是否为bigint(20) unsigned。如果关联表的id是普通bigint(20)(非unsigned),则需要将外键字段改为bigInteger,去掉unsigned修饰。
- 执行数据库命令
关联表创建顺序问题
Laravel迁移按文件名的时间戳顺序执行,如果当前迁移的时间戳早于parties或employees表的迁移文件,那么创建外键时关联表还不存在,必然报错。检查迁移文件的命名,确保parties和employees的迁移先于当前执行。表字符集与排序规则不一致
三个表(ledger_accounts、parties、employees)的字符集和排序规则必须完全相同。执行SHOW CREATE TABLE 表名;命令,对比三个表的CHARSET和COLLATE配置,若存在差异,统一调整为相同配置。字段依赖检查
你的代码中party_id设置了after("account_type"),需确认ledger_accounts表中确实存在account_type字段。若该字段不存在,会导致party_id字段添加失败,进而引发外键创建错误。
修复示例(以字段类型不匹配为例)
如果关联表的id是普通bigInteger,修改迁移中的字段定义:
$table->bigInteger("party_id")->nullable()->default(null)->after("account_type"); $table->bigInteger("employee_id")->nullable()->default(null)->after("party_id");
内容的提问来源于stack exchange,提问作者Hardeep Singh
相关产品推荐
相关产品推荐

