如何在Laravel中为表字段添加外键关联并编写对应迁移?
错误原因
- Laravel 框架中
$table->id()方法默认生成的是 无符号大整型(unsigned bigint) 类型的主键,你在accounts表中定义的currency字段为普通整型(int),外键字段和关联主键的字段类型不匹配,就会触发150号外键格式错误。 - 额外检查项:需要保证currencies表的迁移执行顺序早于accounts表的外键添加迁移,否则关联时找不到目标表也会触发同类错误。
解决方法
场景1:还未执行初始迁移(两张表都未创建)
直接修改accounts表的创建迁移代码,调整currency字段类型即可:
public function up() { Schema::create('accounts', function (Blueprint $table) { $table->id(); $table->string('label', 255); // 调整字段类型和currencies.id保持一致 $table->unsignedBigInteger('currency'); // 可直接在此处定义外键 $table->foreign('currency') ->references('id') ->on('currencies') ->onUpdate('cascade'); }); }
场景2:已经执行过初始迁移(表已存在,需单独写修改迁移)
先修改currency字段类型,再添加外键约束:
public function up() { Schema::table('accounts', function (Blueprint $table) { // 先修改字段类型 $table->unsignedBigInteger('currency')->change(); // 再添加外键约束 $table->foreign('currency') ->references('id') ->on('currencies') ->onUpdate('cascade'); }); }
注意:如果accounts表中已经存在数据,需要先确保currency字段的所有现有值都在currencies表的id字段中存在,否则外键约束创建会失败。
内容的提问来源于stack exchange,提问作者sundowatch
相关产品推荐
相关产品推荐

