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();
nullable
在 constrained
之前也很重要。
您可以在这里找到更多信息,official documentation
【讨论】:
这对于现有数据库来说很重要,感谢您激发我的记忆!【参考方案2】:您可能在inventories
表中有一些记录local_id
在contents
表中没有对应的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