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)在删除级联时引用categoriesid

        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.idbigIncrements,则您的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:插入“收藏夹”()值())

SQLSTATE[HY000]:一般错误:1364 字段

SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值

PDO 错误:SQLSTATE [HY000]:一般错误:2031