Errno:150“ Laravel迁移外键约束的格式不正确”

时间:2018-10-08 05:48:59

标签: php laravel

用户代码

    public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->integer('role_id')->unsigned();
        $table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');
        $table->rememberToken();
        $table->timestamps();
    });
}

用户角色代码

    public function up()
{
    Schema::create('user_roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('user_role');
        $table->timestamps();
    });
}

SQLSTATE [HY000]:常规错误:1005无法创建表sms#sql-1718_62(错误号:150“外键约束格式不正确”)(SQL:更改表{{1} }在删除级联上添加约束users外键(users_role_id_foreign)引用role_iduser_role

4 个答案:

答案 0 :(得分:0)

如果要引用外键,请不要使用

$table->integer('role_id')->unsigned(); 

您应该使用

$table->unsignedInteger('role_id');

这与迁移部分Laravel Migrations中的文档有关。

所以您的新语句最终看起来应该是

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->unsignedInteger('role_id');
        $table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');
        $table->rememberToken();
        $table->timestamps();
    });
}

编辑:

在作者添加 user_role 表的迁移代码后,问题很明显。

作者引用的表称为 user_roles ,而不是外键迁移 user_role 中提到的表。

这是适用于 users 表的迁移。

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->unsignedInteger('role_id');
        $table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade'); // change this line
        $table->rememberToken();
        $table->timestamps();
   });
 }

命名与Laravel命名约定有关,其中所有表均以复数形式命名,而所有模型均以单数形式命名。

编辑2:

OP提到他的迁移顺序错误,这是无法正常工作的原因。

users 表是在 user_roles 表之前创建的。这就是外键导致错误的原因。

希望这对您有所帮助!如果您还有其他问题,请告诉我!

答案 1 :(得分:0)

这个问题是晦涩的。如果引用列和外键列的类型不同,也会发生这种情况。

例如:如果外键列为SMALLINT(5)未签名,而引用列为INT(10)未签名。

答案 2 :(得分:0)

在此处输入您的代码:

       $table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');

您正在引用 user_role 表,但是您没有此表,因此具有 user_roles 表,因此请将user_role改为user_roles

       $table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade');

希望这可以解决您的问题

答案 3 :(得分:0)

您传递的

表名不正确。当您创建名为user_roles的表时,它应该是user_role而不是user_roles

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->integer('role_id')->unsigned();
    $table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade');
    $table->rememberToken();
    $table->timestamps();
});