Laravel:由于出现错误,迁移无法正常进行:150“外键约束格式不正确”错误

时间:2019-01-16 09:46:32

标签: php laravel

我正在尝试迁移包含关系的两个单独的表:

第一张桌子:

public function up()
{

Schema::create('Gerecht', function (Blueprint $table) {
$table->increments('Gerechtcode');
$table->string('Gerecht', 20);

$table->foreign('Gerechtcode')->references('Gerechtcode')->on('Subgerecht');
});

}

第二张表:

public function up()
{

Schema::create('Subgerecht', function (Blueprint $table) {
$table->increments('SubgerechtCode');
$table->string('Gerechtcode',3 );
$table->string('Subgerecht', 25);

$table->foreign('Gerechtcode')->references('Gerechtcode')->on('Gerecht');
});

}

但是它给我一个如下错误:

   Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1005 Can't create table `excellent-taste-db`.`#sql-59c_7d` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `Gerecht` add constraint `gerecht_gerechtcode_foreign` foreign key (`Gerechtcode`) references `Subgerecht` (`Gerechtcode`))

2 个答案:

答案 0 :(得分:0)

您的迁移格式不正确。首先,主键和外键必须是同一类型,在您的情况下,由于主键使用laravel的increments方法,因此外键应为unsigned integer。其次,您将第一个表中的主表设置为同一表中的外部表,这是完全错误的。

您的迁移应如下图所示

第一张桌子

public function up()
{

Schema::create('Gerecht', function (Blueprint $table) {
$table->increments('Gerechtcode');
$table->string('Gerecht', 20);

});

}

第二张表

public function up()
{

Schema::create('Subgerecht', function (Blueprint $table) {
$table->increments('SubgerechtCode');
$table->unsignedInteger('Gerechtcode');
$table->string('Subgerecht', 25);

$table->foreign('Gerechtcode')->references('Gerechtcode')->on('Gerecht');
});

}

您可以查看documentation以获得更多信息。

答案 1 :(得分:0)

在您的第一张桌子上:

public function up()
{

Schema::create('Gerecht', function (Blueprint $table) {
$table->increments('Gerechtcode');
$table->string('Gerecht', 20);

$table->foreign('Gerechtcode')->references('Gerechtcode')->on('Subgerecht');
});

}

您正在使用主键(Gerechtcode)来引用另一个表。这是不可能的。我认为,如果您将第一张表更改为:

public function up()
{

Schema::create('Gerecht', function (Blueprint $table) {
$table->increments('Gerechtcode');
$table->unsignedInteger('SubgerechtCode');
$table->string('Gerecht', 20);

$table->foreign('SubgerechtCode')->references('Gerechtcode')->on('Subgerecht');
});

}

第二张表

public function up()
{

Schema::create('Subgerecht', function (Blueprint $table) {
$table->increments('SubgerechtCode');
$table->string('Subgerecht', 25);
});

}

通过这种方式,您可以在Laravel中处理一对多关系。但是您的代码不允许我理解您的需求。