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()