我在运行迁移时遇到问题。我有一些带有一些表的mysql数据库。具体表格为product_blender
。表中的一些字段是这样的:
- id(PK)
- area_id(FK)
- 居民(varchar)
- heating_type_id(FK)
- ...
现在我想创建另一个名为installateur_types
的表。该表需要包含 PK 和 varchar字段。我还想在product_blender
表格中为我新创建的表格的 id 创建一个 FK 。
这就是我所做的:
创建迁移以创建表格:
public function up()
{
Schema::create('installateur_types', function(Blueprint $table)
{
$table->increments('id');
$table->string('type');
});
}
public function down()
{
Schema::drop('installateur_types');
}
运行迁移,这很成功。表格是使用正确的字段创建的。
然后我创建了迁移以将FK字段添加到product_blender表。
public function up()
{
Schema::table('product_blenders', function ($table) {
$table->integer('installateurtype_id')->unsigned();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
});
}
public function down()
{
//
}
我做错了什么?
答案 0 :(得分:4)
如果您的products_blender
表不为空,那么当您添加一个非空的新列(这是eloquent的默认值)时,它将自行设置一些默认值。此新列所引用的表中可能无法使用此值,从而导致外键约束失败。
解决此问题的方法之一是为新列提供默认值,或者将其设为可为空。
$table->integer('installateurtype_id')->unsigned()->nullable();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
还有另一种解决方案可以关闭此检查,可以使用DB::statement('SET FOREIGN_KEY_CHECKS=0;')
完成。然后再使用DB::statement('SET FOREIGN_KEY_CHECKS=1;')
将其转换为未来。在您的代码中,您可以执行类似
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$table->integer('installateurtype_id')->unsigned();
$table->foreign('installateurtype_id')->references('id')->on('installateur_types')->onDelete('cascade');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');