无法约束到laravel和mysql上的关联表

ufj5ltwl  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(220)

我使用的是mysql v5.7和laravelv5.6,我在产品表中添加了外键。
但这样的错误。

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `product` add constraint `product_category_id_foreign` foreign key (`category_id`) references `category` (`id`) on delete cascade)

这是我的产品表

public function up()
    {
        Schema::create('product', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('category_id')->unsigned()->nullable();
            $table->integer('admin_id')->unsigned()->nullable();
            $table->string('name');
            $table->string('description');
            $table->integer('price');
            $table->binary('image')->nullable(false)->change();
            $table->timestamps();
        });
        Schema::table('product', function($table){
            $table->foreign('category_id')->references('id')->on('category')->onDelete('cascade');
            $table->foreign('admin_id')->references('id')->on('admin')->onDelete('cascade');
        });
    }

这是我的分类表

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

这里怎么了?

nx7onnlm

nx7onnlm1#

一个可能的问题是 product.category_id (外键列)和 category.id (引用的主键)。
(这只是一种可能性。问题可能是由其他原因造成的。)
但是我们应该首先检查两列的数据类型是否完全匹配。如果它们不匹配,那么我们将无法定义innodb外键约束。
我猜是这样的 category.id 定义为 BIGINT 数据类型。
(这是猜测,我不是laravel schema builder的Maven,但我确实看到schema builder在屏蔽/隐藏mysql表的实际sql定义方面做了大量工作。)
(根本不清楚为什么laravel要求指定外键列的数据类型。我们知道它与引用列的数据类型匹配。)
我想解决办法是改变这条线
发件人:

$table->integer('category_id')->unsigned()->nullable();

收件人:

$table->bigInteger('category_id')->nullable();

相关问题