使用laravel创建外键会给出错误:无法添加外键约束

时间:2019-05-20 11:22:45

标签: mysql laravel migration

我想添加两个表,一个产品表和一个类别表。然后,我想将产品表中的类别ID链接到类别表中的主键。这是我的代码:

创建我的产品表的代码:

public function up()
{
    Schema::create('products', function (Blueprint $table) {
      $table->bigIncrements('id');
      $table->string('title');
      $table->string('imgpath');
      $table->text('description');
      $table->integer('price');
      $table->integer('hotItemNumber')->nullable();
      $table->timestamps();
      $table->softDeletes();
    });
}

创建我的类别表的代码:

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('categroyName');
        $table->timestamps();
    });
}

用于创建我的外键的代码(在单独的迁移文件中):

public function up()
{
  Schema::table('products', function($table) {
    $table->integer('category_id')->unsigned()->index();
    $table->foreign('category_id')->references('id')->on('categories');
  });
}

我希望创建一个外键,但是会出现错误。

  

SQLSTATE [HY000]:常规错误:1215无法添加外键约束   (SQL:更改表products添加约束   products_categoryid_foreign个外键(categoryid)引用   categoriesid))

2 个答案:

答案 0 :(得分:1)

在您的新迁移中,尝试更改以下类型

public function up()
{
  Schema::table('products', function($table) {
    $table->bigInteger('category_id')->unsigned()->index();
    $table->foreign('category_id')->references('id')->on('categories');
  });
}

因为在您的categories表中,该ID的类型为bigIncrements

答案 1 :(得分:1)

因此,您的productsid具有int数据类型,categoryid应该具有相同的数据类型。

改为使用$table->unsignedBigInteger('categoryid');

Reference

  

外键列必须具有相同的数据类型+相同的长度+   与相应参考列的比例相同