Laravel - 使用数据在现有表上添加外键

时间:2017-06-25 08:49:27

标签: mysql laravel foreign-keys migration laravel-5.4

我现有表objects包含数据。现在我需要添加一个名为holdings的新表,并添加从对象到holdings表的关系。在迁移文件中,我打印出来:

$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");

并在尝试迁移时出现此错误

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update 
a child row: a foreign key constraint fails (`kolomnaoffice`.`#sql-f10_126` 
CONSTRAINT `objects_holding_id_foreign` FOREIGN KEY (`holding_id`) 
REFERENCES `holdings` (`id`) ON DELETE NO ACTION) (SQL: alter table `objects` add constraint 
`objects_holding_id_foreign` foreign key (`holding_id`) references `holdings` 
(`id`) on delete NO ACTION)

我有正确的数据库结构(都是InnoDB),字段存在并且具有正确的类型(int)。唯一不同的是,表objects填充了数据,表holdings是新的且空的。

4 个答案:

答案 0 :(得分:7)

holding_id列应为unsigned

创建一个新的迁移文件并进行迁移,迁移代码应如下所示:

Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->change();

    $table->foreign('holding_id')->references('id')->on('holdings');
});

调用change()方法来更改现有列的结构。

没有必要调用onDelete("NO ACTION")方法。

答案 1 :(得分:3)

感谢Mohammad,但是这个解决方案对我来说不起作用,因为我Laravel 5.4并且在这里有不同的情况,我的另一个表已经存在,在这里我发现它可能对某人有所帮助。

Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->index()->nullable();

    $table->foreign('holding_id')->references('id')->on('holdings');
});

index()nullable()它成功了。

修改 无需index()只需要nullable()

答案 2 :(得分:0)

要添加外键,请先确保您的列标记为无符号。

只需在您的行前添加一行:

resultCode

答案 3 :(得分:0)

对于 Laravel 8(可能是 7+ - 我没有确认这一点) - $table->id() 的默认值现在是一个无符号的 big int。要使迁移与当前版本匹配(在撰写本文时),它将是这样的:

$table->unsignedBigInteger("domain_id")->nullable();

$table->foreign("domain_id")->references("id")->on("domains");

Nullable 显然是可选的。