Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败

Posted

技术标签:

【中文标题】Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败【英文标题】:Laravel migration - Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails 【发布时间】:2018-04-26 05:44:22 【问题描述】:

我正在尝试为使用此迁移创建的表 inventories 运行迁移:

Schema::create('inventories', function (Blueprint $table) 
    $table->increments('id');
    $table->integer('remote_id')->unsigned();
    $table->integer('local_id')->unsigned();
    $table->string('local_type');
    $table->string('url')->nullable()->unique();
    $table->timestamps();
);

我正在尝试添加一个运行迁移,我正在向表中添加外键:

Schema::table('inventories', function (Blueprint $table) 
    $table->foreign('local_id')->references('id')->on('contents')->onDelete('cascade');
);

但是,当我尝试运行迁移时出现错误:

[照亮\数据库\查询异常]

SQLSTATE[23000]:违反完整性约束:1452 无法添加或 更新子行:外键约束失败 (middleton .#sql-5d6_162a, 约束inventories_local_id_foreign 外国 KEY (local_id) 参考contents (id) ON DELETE CASCADE ) (SQL:alter tableinventories添加约束 inventories_local_id_foreign 外键 (local_id) 引用 contents (id) 删除级联)

[PDO异常]

SQLSTATE[23000]:违反完整性约束:1452 无法添加或 更新子行:外键约束失败 (middleton .#sql-5d6_162a,约束inventories_local_id_foreign 外国 KEY (local_id) 参考contents (id) ON DELETE CASCADE )

我做错了什么?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。通过将nullable 添加到字段来修复它:

Schema::create('table_name', function (Blueprint $table) 
    ...
    $table->integer('some_id')->unsigned()->nullable();
    $table->foreign('some_id')->references('id')->on('other_table');
    ...
);

请注意,迁移后所有存在的行都将具有some_id = NULL

UPD

从 Laravel 7 开始,有更短的方法可以做同样的事情:

$table->foreignId('some_id')->nullable()->constrained();

nullableconstrained 之前也很重要。

您可以在这里找到更多信息,official documentation

【讨论】:

这对于现有数据库来说很重要,感谢您激发我的记忆!【参考方案2】:

您可能在inventories 表中有一些记录local_idcontents 表中没有对应的id,因此出现错误。您可以通过以下两种方式之一来解决它:

在关闭foreign_key_checks 的情况下运行迁移。这将禁用现有行的外键约束(如果这是您想要的)。记录在案here 仅插入那些在contents 表中具有对应id 字段的记录。您可以使用INSERT INTO.. WHERE EXISTS 查询过滤掉记录,并仅插入这些记录。

【讨论】:

是的,一旦我删除了所有表并立即运行所有迁移,它就可以工作了。谢谢

以上是关于Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败的主要内容,如果未能解决你的问题,请参考以下文章

:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败

SQLSTATE [23000]:完整性约束违规:1452 无法在 laravel 迁移中添加或更新子行

完整性约束违规:1452 无法添加或更新子行:外键约束失败(Laravel 应用程序)

SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 - Laravel

如何在 Laravel 5.1 完整性约束违规中添加外键:1452?

SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败 - Laravel