Laravel 迁移 - 一般错误:1215 无法添加外键约束
Posted
技术标签:
【中文标题】Laravel 迁移 - 一般错误:1215 无法添加外键约束【英文标题】:Laravel Migrations - General error: 1215 Cannot add foreign key constraint 【发布时间】:2021-03-29 13:42:27 【问题描述】:我有多个具有多个外键的表,但是当我迁移它时找不到另一个迁移,因为它还没有进行。
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `post` add constraint `post_vote_id_foreign` foreign key (`vote_id`) references `vote` (`id`))
张贴表
Schema::create('post', function (Blueprint $table)
$table->id();
$table->unsignedBigInteger('topic_id');
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('vote_id');
$table->string('title');
$table->string('summary');
$table->string('image');
$table->timestamps();
$table->foreign('topic_id')->references('id')->on('topic');
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('vote_id')->references('id')->on('vote');
);
投票表查看帖子的所有投票
Schema::create('vote', function (Blueprint $table)
$table->id();
$table->unsignedBigInteger('post_id');
$table->unsignedBigInteger('user_id');
$table->timestamps();
$table->foreign('post_id')->references('id')->on('post');
$table->foreign('user_id')->references('id')->on('users');
);
【问题讨论】:
这些迁移将始终返回此错误。你有一个循环引用post
表有一个列vote_id
引用vote
表和vote
表有一个列post_id
引用post
表 - 所以无论哪个迁移首先运行都会出错。再次考虑您的迁移设计/定义为什么需要这样的循环引用
【参考方案1】:
虽然循环引用并不好 - 很可能表明设计不佳。但是,如果您真的想要循环引用
Schema::create('post', function (Blueprint $table)
$table->id();
$table->unsignedBigInteger('topic_id');
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('vote_id');
$table->string('title');
$table->string('summary');
$table->string('image');
$table->timestamps();
$table->foreign('topic_id')->references('id')->on('topic');
$table->foreign('user_id')->references('id')->on('users');
);
您可以在创建投票表后更改 post 表以定义外键
Schema::create('vote', function (Blueprint $table)
$table->id();
$table->unsignedBigInteger('post_id');
$table->unsignedBigInteger('user_id');
$table->timestamps();
$table->foreign('post_id')->references('id')->on('post');
$table->foreign('user_id')->references('id')->on('users');
);
Schema::table('post', function(Blueprint $table)
$table->foreign('vote_id')->references('id')->on('vote');
);
【讨论】:
【参考方案2】:请务必注意,迁移文件按创建顺序运行。因此,通过您的表设计并首先获取那些独立的(更改它们的文件名,即时间戳,以便它们首先出现),然后是依赖的(具有独立外键的那些)。希望你明白吗?
【讨论】:
我试过了,但是这两个表需要彼此所以我不能真正改变名称来解决这个问题 不,我认为你误会了。当我说“更改名称”时,我的意思是文件名而不是表名。您更改迁移文件的文件名,以便在具有外键的迁移文件(表)之前首先创建依赖较少的迁移文件(表),否则您将不断收到您遇到的错误。 并从 post 表中删除 vote_id。你真的不需要它,这就是导致错误的原因。 PS:post_migration 文件应该在 vote_migration 文件之前。以上是关于Laravel 迁移 - 一般错误:1215 无法添加外键约束的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 Laravel 5.8
Laravel 5.0 [PDOException] SQLSTATE[HY000]:一般错误:1215 无法添加外键约束