【问题标题】:General error: 1005 Can't create table ,Foreign key constraint is incorrectly formed in laravel一般错误:1005 Can't create table ,在 laravel 中外键约束形成错误
【发布时间】:2017-05-06 16:37:08
【问题描述】:

为什么 laravel 模式回复

[照亮\数据库\查询异常] SQLSTATE[HY000]: 一般错误: 1005 Can't create table test.#sql-13cc_d0 (errno: 150 "外键约束格式不正确") (SQL: alter table cities add constrai nt cities_provinces_id_foreign外键(provinces_id)在删除级联时引用provincesid

[PDOException] SQLSTATE[HY000]:一般错误:1005 无法创建 表test.#sql-13cc_d0 (errno: 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');

    });

【问题讨论】:

    标签: laravel laravel-5.2


    【解决方案1】:

    时间继续,但我会评论其他内容。

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

    我认为这是一个小而无聊的调试的解决方案。 (对不起我的英语)

    【讨论】:

    • 其实我早就知道了。但我忘记了。 ForeignKeys 的引用表总是需要首先创建。我更改了表格的时间戳。我已经创建了我引用的表。答案对我有用。谢谢。
    【解决方案2】:

    外键和引用表必须是同一类型,自动生成的 id 是 bigInteger,所以不要将列定义为 Integer,而是使用 bigInteger insteed。这为我解决了问题

    【讨论】:

      【解决方案3】:

      尝试先建表再添加约束:

      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');
      });
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-10-04
          • 2013-12-30
          • 2020-12-19
          • 2020-07-22
          • 1970-01-01
          • 2021-08-06
          • 2020-12-02
          • 2020-03-23
          • 2021-08-31
          相关资源
          最近更新 更多