SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint Laravel 5.8

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint Laravel 5.8

我正在尝试使用 Laravel 5.8.

为 "users" table 创建一个外键

Laravel 5.8自动生成的迁移table如下,

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

然后从我的 "repositories" table 我引用 "users" table 如下,

        Schema::create('repositories', function (Blueprint $table) {
            $table->string('id', 8)->primary();
            $table->string('name')->nullable(false);
            $table->string('size')->nullable(false);
            $table->unsignedInteger('user_id')->nullable(false);
            $table->timestamps();
        });


        Schema::table('repositories', function (Blueprint $table) {
            $table->foreign('user_id')->references('id')->on('users');
        });

但是我在这段代码上遇到 "General error: 1215 Cannot add foreign key constraint" 错误。有很多与此问题相关的解决方案。

Migration: Cannot add foreign key constraint in laravel

我已经尝试过上述解决方案。但是我的问题没有解决

试试这个

Schema::create('repositories', function (Blueprint $table) {
     $table->string('id', 8)->primary();
     $table->string('name')->nullable(false);
     $table->string('size')->nullable(false);
     $table->unsignedBigInteger('user_id');
     $table->timestamps();

     $table->foreign('user_id')->references('id')->on('users');
});

根据laravel 5.8Foreign Key Constraints

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});

可能是因为user_id列与id列不匹配

user_id 需要是 bigInteger 类型并且也被索引。

参考:

从 Laravel 5.8 开始,使用 bigIncrements 代替主键的增量。如果您使用 bigIncrements 作为主键,则必须将 user_id 字段声明为 bigInteger 而不是整数。这样主键和外键的字段就会共享同一类型的数据,否则会报错