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 需要 运行,然后是课程,然后是剧集
我正在使用 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 需要 运行,然后是课程,然后是剧集