我正在尝试为使用此迁移创建的表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');
});
但是,当我尝试运行迁移时出现错误:
[照亮\数据库\ QueryException]
SQLSTATE [23000]:完整性约束违规:1452无法添加或 更新子行:外键约束失败(middleton
。#sql-5d6_162a
,CONSTRAINTinventories_local_id_foreign
外国人 KEY(local_id
)REFERENCEScontents
(id
)ON DELETE CASCADE) (SQL:alter tableinventories
添加约束inventories_local_id_foreign
外键(local_id
)引用 关于删除级联的contents
(id
)[PDOException]
SQLSTATE [23000]:完整性约束违规:1452无法添加或 更新子行:外键约束失败(
middleton
。#sql-5d6_162a
,CONSTRAINTinventories_local_id_foreign
外国人 KEY(local_id
)REFERENCEScontents
(id
)ON DELETE CASCADE)
我做错了什么?
答案 0 :(得分:7)
inventories
表中可能有local_id
表中的某些记录在id
表中没有对应的contents
,因此出错。您可以通过以下两种方式之一解决它:
foreign_key_checks
时运行迁移。这将禁用现有行的外键约束(如果这是您想要的)。它记录了here id
表中具有相应contents
字段的记录。您可以使用INSERT INTO.. WHERE EXISTS
查询过滤掉记录,并仅插入这些记录。答案 1 :(得分:7)
有同样的问题。通过在字段中添加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