我已有包含数据的表
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
是新的且空的。
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")
方法。
穆罕默德的解决方案对我不起作用,因为我正在使用
Laravel 5.4
并且这里有一个不同的情况,我的其他表已经存在。这是我发现的有效方法,可能会对某些人有所帮助。
Schema::table('objects', function (Blueprint $table) {
$table->integer('holding_id')->unsigned()->nullable();
$table->foreign('holding_id')->references('id')->on('holdings');
});
用
nullable()
就成功了。
这适用于表已满数据的情况,这会导致在没有默认值的情况下添加外键变得非常困难,所以
nullable()
可以是一个很好的解决方案;那么,如果您可以在更改数据时更改后者并使其像普通 FK 一样不可为空。
要添加外键,首先确保您的列被标记为无符号。
只需在行前添加一行:
$table->integer('holding_id')->unsigned();
$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");
如果你有一个大表,比如说 100 万条以上的记录,我想最好的操作计划是: