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

问题描述 投票:0回答: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
是新的且空的。

mysql laravel foreign-keys migration laravel-5.4
4个回答
25
投票

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")
方法。


11
投票

穆罕默德的解决方案对我不起作用,因为我正在使用

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 一样不可为空。


0
投票

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

只需在行前添加一行:

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

0
投票

如果你有一个大表,比如说 100 万条以上的记录,我想最好的操作计划是:

  • 创建一个具有 unsigned int 数据类型的字段
  • 确保随后向表中插入新内容,以便为列添加值。因此,相应地更改您的插入查询
  • 创建一个队列来更新旧记录并运行它
  • 队列结束后,将字段转换为外键
© www.soinside.com 2019 - 2024. All rights reserved.