Laravel 5.7:上次迁移创建了表,但没有在迁移表中注册



Laravel版本:5.7

PHP版本:7.2.9

数据库驱动程序&版本:mysql

说明上次迁移创建了表,但未在迁移表中注册

复制步骤我有14次迁移。如果我运行php artisan migrate表已创建,但未注册为运行迁移我已经放弃了家园数据库几次

我的迁移状态表

最终,当我想为开发目的刷新、回滚或迁移时,我会收到这个错误,告诉我表存在,但不在迁移上

vagrant@kakbima:~/code$ php artisan migrate
Migrating: 2018_12_13_091954_create_product_subcategories_table

Illuminate\Database\QueryException:SQLSTATE[42S01]:基表或视图已存在:1050表"product_subcategories"已存在(SQL:创建表product_subcategories(id int unsigned not nullauto_increment主键,名称varchar(191)不为null,product_category_id int unsigned not null,created_at timestamp null,updated_at timestamp null)默认字符集utf8mb4 collate'utf8mb4_unicode_ci')

public function up()
{
Schema::create('product_subcategories', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->unsignedInteger('product_category_id');
$table->foreign('product_category_id')
->references('id')->on('product_categories')
->onUpdate('cascade')
->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('product_subcategories');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}

我遇到了同样的问题,解决方案来自https://laracasts.com/discuss/channels/laravel/migrated-migration-files-not-listed-in-migration-table?page=1这是帖子:

好吧,所以……对于那些在谷歌上搜索了一番试图弄清楚为什么会发生这种情况(而排序规则/字符集不是问题所在)后提出这个问题的人来说,以下是我们的发现。

我们的第一次迁移只是一个简单的\DB::unprepared(file_get_contents(DIR.'/../initial.sql');,它导入一个现有的数据库(在我们开始使用迁移之前创建)。我们发现,在中的3-4次迁移中,它只是停止将它们注册为"已运行",即使迁移正在运行(并且更改已提交到数据库)。

奇怪!最终,我们发现在上面提到的.sql文件的顶部,有一行狡猾的代码,上面写着SET AUTOCOMMIT=0;,并且在文件末尾没有任何内容将其设置回初始值。这导致迁移中的一切都变得一团糟,而且它没有将一些迁移注册为已运行。

只需删除SET AUTOCOMMIT=0;从.sql文件减轻了我们的问题。

我希望这能帮助其他人,如果没有,我希望在未来的某个时候,当我不可避免地在一年内再次遇到同样的问题时,我能找到这个答案

最新更新