我现有表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
是新的且空的。
答案 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 显然是可选的。