Laravel 5.4: SQLSTATE[HY000]: General error: 1005 Can't create table "Foreign key constraint is incorrectly formed"

Laravel 5.4: SQLSTATE[HY000]: General error: 1005 Can't create table "Foreign key constraint is incorrectly formed"

我正在使用 Laravel 5.4 并且我添加了这个迁移:

public function up()
    {
        Schema::create('episodes', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('course_id')->unsigned();
            $table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
            $table->string('type', 10);
            $table->string('title');
            $table->string('slug');
            $table->text('description');
            $table->text('body');
            $table->string('videoUrl');
            $table->string('tags');
            $table->string('time', 15)->default('00:00:00');
            $table->integer('number');
            $table->integer('viewCount')->default(0);
            $table->integer('commentCount')->default(0);
            $table->integer('downloadCount')->default(0);
            $table->timestamps();
        });
    }

现在当我 运行 php artisan migrate 时,我得到这个错误:

SQLSTATE[HY000]: 一般错误: 1005 无法创建 table elearning.episodes (errno: 150 "Foreign键约束的格式不正确") (SQL: alter table episodes add constraint episodes_course_id_foreign foreign key (course_id) references courses (id) 删除级联)

我也试过了,但仍然得到同样的错误:

$table->unsignedBigInteger('course_id');

那么我怎样才能正确运行这个迁移呢?我真的被这个困住了,请帮帮我...


用户迁移:

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('level')->default('user');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

课程迁移:

Schema::create('courses', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->string('type', 10);
            $table->string('title');
            $table->string('slug');
            $table->text('description');
            $table->text('body');
            $table->string('price',50);
            $table->string('imageUrl');
            $table->string('tags');
            $table->string('time', 15)->default('00:00:00');
            $table->integer('viewCount')->default(0);
            $table->integer('commentCount')->default(0);
            $table->timestamps();
        });

而不是使用:

$table->increments('id');

你应该使用:

$table->id();

(更简单)。

建立你的外国关系,而不是拥有

$table->integer('course_id')->unsigned();
$table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');

你可以使用:

$table->foreignId('course_id')->constrained()->cascadeOnDelete();

这将自动创建一个正确类型的列(无符号大整数),然后通过在课程 table 上查找 id 列来创建关系 table。

编辑

由于您使用的是旧版本的 Laravel,您不能使用 id() 函数,因此只需将 course_id 列创建为一个大整数即可:

$table->bigInteger('course_id')->unsigned();

然后像以前一样建立关系。

一个问题可能是您没有将 unsignedBigInteger 设为 course_id

 Schema::create('episodes', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedBigInteger('course_id')->index('course_id');  
        $table->string('type', 10);
        $table->string('title');
        $table->string('slug');
        $table->text('description');
        $table->text('body');
        $table->string('videoUrl');
        $table->string('tags');
        $table->string('time', 15)->default('00:00:00');
        $table->integer('number');
        $table->integer('viewCount')->default(0);
        $table->integer('commentCount')->default(0);
        $table->integer('downloadCount')->default(0);
        $table->timestamps();

        $table->index( [ 'created_at', 'updated_at' ] );

       //Constraint
        $table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');

   });

第二个问题可能是您没有进行迁移并没有破坏顺序,例如,第一个用户 table 需要 运行,然后是课程,然后是剧集