常规错误:1005无法创建表,在laravel中错误地形成了外键约束

时间:2016-12-21 09:45:33

标签: laravel laravel-5.2

为什么laravel架构回复

  

[照亮\数据库\ QueryException]     SQLSTATE [HY000]:常规错误:1005无法创建表test#sql-13cc_d0(错误号:150“外键约束形成错误”)(SQL:alter table cities add constrai     nt cities_provinces_id_foreign外键(provinces_id)在删除级联上引用provincesid

     

[PDOException] SQLSTATE [HY000]:常规错误:1005无法创建   table test#sql-13cc_d0(错误:150“外键约束是   错误形成“)

第一张表

Schema::create('provinces', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->boolean('is_enable');
        $table->boolean('is_deletable');
        $table->boolean('is_editable');
        $table->boolean('deleted');
        $table->timestamps();
    }); 

第二张表

    Schema::create('cities', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->integer('province_id')->unsigned()->index();
        $table->boolean('is_enable');
        $table->boolean('is_deletable');
        $table->boolean('is_editable');
        $table->boolean('deleted');
        $table->timestamps();


        $table->foreign('province_id')
            ->references('id')->on('provinces')
            ->onDelete('cascade');

    });

4 个答案:

答案 0 :(得分:1)

您应确保provinces表迁移在cities表迁移之前运行。

您应该更改provincescities迁移文件名,以确保provinces表格迁移文件开头的时间戳位于cities表之前。

答案 1 :(得分:1)

首先尝试创建表,然后添加约束:

Schema::create('cities', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->integer('province_id')->unsigned()->index();
    $table->boolean('is_enable');
    $table->boolean('is_deletable');
    $table->boolean('is_editable');
    $table->boolean('deleted');
    $table->timestamps();
});

Schema::table('cities', function (Blueprint $table) {
    $table->foreign('province_id')->references('id')->on('provinces')->onDelete('cascade');
});

答案 2 :(得分:1)

时间到了,但我会发表其他意见。

安迪尔是对的!您必须具有相同的类型。在这种情况下,外键的类型应该为bigInteger,因为您在参考表上有bigIncrements

我认为这是进行一些乏味的调试的解决方案。 (对不起,我的英语)

答案 3 :(得分:0)

外键和引用表必须为同一类型,自动生成的ID为bigInteger,因此,应使用bigInteger指示,而不是将列定义为Integer。为我解决了问题