SQLSTATE[HY000]: 一般错误: 1005 Can't create table `school`.`posts` (errno: 150 "Foreign key constr
Posted
技术标签:
【中文标题】SQLSTATE[HY000]: 一般错误: 1005 Can\'t create table `school`.`posts` (errno: 150 "Foreign key constraint is wrongly forms")【英文标题】:SQLSTATE[HY000]: General error: 1005 Can't create table `school`.`posts` (errno: 150 "Foreign key constraint is incorrectly formed")SQLSTATE[HY000]: 一般错误: 1005 Can't create table `school`.`posts` (errno: 150 "Foreign key constraint is wrongly forms") 【发布时间】:2021-08-31 20:09:41 【问题描述】:在一切之前,我尝试了许多网站和论坛来解决这个问题,直到这些帖子与 *** 中的这个问题相关,但我无法解决问题。 我想在 Post 和 Category 模型之间创建 一对多 关系,但我得到了那个错误代码。
SQLSTATE[HY000]: 一般错误: 1005 Can't create table school
.posts
(errno: 150 "外键约束格式不正确") (SQL: alter table posts
add constraint posts_category_id_foreign
外键(category_id
)在删除级联时引用categories
(id
)
Schema::create('categories', function (Blueprint $table)
$table->id();
$table->string('name');
$table->string('slug');
$table->timestamps();
);
Schema::create('posts', function (Blueprint $table)
$table->id();
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->nullable()->references('id')->on('categories');
$table->string('title')->nullable();
$table->timestamps();
);
class Category extends Model
use HasFactory;
protected $table = 'categories';
protected $guarded = [];
public function posts()
return $this->hasMany(Post::class);
class Post extends Model
use HasFactory;
protected $guarded = [];
public function category()
return $this->belongsTo(Category::class);
请帮助我,感谢您的帮助。
【问题讨论】:
【参考方案1】:您的foreign_key
字段和您的id
应该属于同一类型,例如,如果categories.id
是bigIncrements
,则您的Post table
中的foreign_key
也应该是bigInteger
。
分类表
Schema::create('categories', function (Blueprint $table)
$table->bigIncrements('id');
$table->string('name');
$table->string('slug');
$table->timestamps();
);
发布表
Schema::create('posts', function (Blueprint $table)
$table->id();
$table->bigInteger('category_id')->unsigned()->nullable();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->string('title')->nullable();
$table->timestamps();
);
注意:您应该确保 Category Table 迁移在 Post Table 迁移之前运行。
【讨论】:
我认为建议->onDelete('cascade')
使用category_id
是不明智的。仅仅因为一个 category 被删除并不一定意味着所有相关的 post 也应该消失。
没问题,category
很少会被删除,所有相关的帖子也会被删除。
@hadayatullah-sarwary,如果你不知道,cascade
基本上就是这样做的。
@steven7mwesigwa 如果一条记录被删除,该记录的所有子记录将从其他表中删除。
@Hedayatullah Sarwary 谢谢,问题是 Post 表在 Category 表之前迁移,正如你所说我颠倒顺序然后迁移没有任何问题。【参考方案2】:
$table->id();
创建一个unSignedBigInteger
(UNSIGNED BIGINT)。
$table->integer('category_id')->unsigned();
创建一个unSignedInteger
。 (无符号整数)。
修复
// Instead of:
$table->integer('category_id')->unsigned(); ❌
// Use this:
$table->unsignedBigInteger("category_id")->nullable(); ✅
$table->foreign("category_id")
->references("id")
->on("categories")
->onDelete("set null");
【讨论】:
【参考方案3】:从表格底部删除外键约束
请看截图 here
【讨论】:
以上是关于SQLSTATE[HY000]: 一般错误: 1005 Can't create table `school`.`posts` (errno: 150 "Foreign key constr的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 Laravel 5.8
错误 SQLSTATE [HY000]:一般错误:1364 字段“名称”没有默认值(SQL:插入“收藏夹”()值())