Mysql Laravel-在包含数据的现有表上添加外键
我有一个包含数据的现有表Mysql Laravel-在包含数据的现有表上添加外键,mysql,laravel,foreign-keys,migration,laravel-5.4,Mysql,Laravel,Foreign Keys,Migration,Laravel 5.4,我有一个包含数据的现有表对象。现在我需要添加名为holdings的新表,并添加一个从对象到holdings表的关系。在迁移文件中,我打印以下内容: $table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION"); 并在尝试迁移时获取此错误 SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot a
对象
。现在我需要添加名为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)。唯一不同的是,表
对象
中填充了数据,而表控股
是新的、空的。要添加外键,首先确保将列标记为未签名
只需在行前添加一行:
$table->integer('holding_id')->unsigned();
$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");
holding\u id
列应该是unsigned
创建新的迁移文件并进行迁移,迁移代码如下:
Schema::table('objects', function (Blueprint $table) {
$table->integer('holding_id')->unsigned()->change();
$table->foreign('holding_id')->references('id')->on('holdings');
});
调用change()
方法来更改现有列的结构
没有必要调用onDelete(“无操作”)方法。谢谢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()
对于Laravel 8(可能是7+——我没有确认这一点)-$table->id()
的默认值现在是一个无符号的大整数。要使迁移与当前版本相匹配(在编写时),应该是这样的:
$table->unsignedBigInteger("domain_id")->nullable();
$table->foreign("domain_id")->references("id")->on("domains");
可以为null显然是可选的。尝试将其设置为可以为null的列我想知道一个可以为null的foregin键是否是一个好主意?如果我不高兴,请纠正我worong@toing_toing在我的例子中,表中充满了数据,这将使添加没有默认值的外键变得非常困难,因此
nullable()
可能是一个很好的解决方案,如果您想在更改数据时更改后者,我有12k行,列是无符号的,但在laravel 5.8中仍然不起作用down()函数怎么样?。如果我需要回滚迁移?更改适用于之前有列的情况,但对于exist表和数据,我们需要添加带有null inex的外键,如[…]->index()->nullable()代码>