为什么laravel架构回复
[照亮\数据库\ QueryException] SQLSTATE [HY000]:常规错误:1005无法创建表
test
。#sql-13cc_d0
(错误号:150“外键约束形成错误”)(SQL:alter tablecities
add constrai ntcities_provinces_id_foreign
外键(provinces_id
)在删除级联上引用provinces
(id
)[PDOException] SQLSTATE [HY000]:常规错误:1005无法创建 table
test
。#sql-13cc_d0
(错误:150“外键约束是 错误形成“)
第一张表
Schema::create('provinces', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->boolean('is_enable');
$table->boolean('is_deletable');
$table->boolean('is_editable');
$table->boolean('deleted');
$table->timestamps();
});
第二张表
Schema::create('cities', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('province_id')->unsigned()->index();
$table->boolean('is_enable');
$table->boolean('is_deletable');
$table->boolean('is_editable');
$table->boolean('deleted');
$table->timestamps();
$table->foreign('province_id')
->references('id')->on('provinces')
->onDelete('cascade');
});
答案 0 :(得分:1)
您应确保provinces
表迁移在cities
表迁移之前运行。
您应该更改provinces
或cities
迁移文件名,以确保provinces
表格迁移文件开头的时间戳位于cities
表之前。
答案 1 :(得分:1)
首先尝试创建表,然后添加约束:
Schema::create('cities', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('province_id')->unsigned()->index();
$table->boolean('is_enable');
$table->boolean('is_deletable');
$table->boolean('is_editable');
$table->boolean('deleted');
$table->timestamps();
});
Schema::table('cities', function (Blueprint $table) {
$table->foreign('province_id')->references('id')->on('provinces')->onDelete('cascade');
});
答案 2 :(得分:1)
时间到了,但我会发表其他意见。
安迪尔是对的!您必须具有相同的类型。在这种情况下,外键的类型应该为bigInteger
,因为您在参考表上有bigIncrements
。
我认为这是进行一些乏味的调试的解决方案。 (对不起,我的英语)
答案 3 :(得分:0)
外键和引用表必须为同一类型,自动生成的ID为bigInteger,因此,应使用bigInteger指示,而不是将列定义为Integer。为我解决了问题