(Laravel)errno:150“外键约束不正确

时间:2017-09-07 17:11:48

标签: php mysql laravel laravel-5

我尝试迁移我的表,但它显示错误:

  

错误:150“异常形成外键约束”)(SQL:alter   表users添加约束users_role_id_foreign外键   (role_id)引用rolesid))

这是我的表格:

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


Schema::create('roles', function (Blueprint $table) {
        $table->increments('id')->unsigned();
        $table->string('name')->unique();
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->timestamps();
    });


Schema::create('posts', function (Blueprint $table) {
        $table->increments('id')->unsigned();
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('content');
        $table->string('image');
        $table->timestamps();
    });

2 个答案:

答案 0 :(得分:1)

问题是,当您使用users表的外键创建roles表时,roles表尚不存在,因此您无法添加外键引用它。

我还注意到roles表还有一个引用users表的外键,这使得情况更加棘手。

如果您完全确定roles表需要users表的外键,那么您需要从users表定义中删除外键创建,并添加在alter table表创建后,它会单独返回roles

但是,我不确定roles表应该有users表的fk(除非它代表创建该角色的用户),因为你可以有多个用户一名角色。如果您正在建模多对多关系,那么这不是实现它的方法。但这与当前错误无关,因此仅将其视为旁注。

答案 1 :(得分:0)

有时由于迁移顺序也可能发生错误。如果面对errno 150“外键约束格式不正确”,请转到migrations文件夹并检查是否首先执行了父表迁移。如果首先按照迁移顺序执行子表迁移,它将尝试查找外键绑定并显示该错误。