Laravel 迁移:基础 table 或视图已存在

Laravel Migration: Base table or view already exists

背景

我们从一开始就为我们的一个项目使用 Laravel (5.8) 迁移。在开发过程中,我们进行了一些迁移。一段时间后,我们发现,一些迁移​​与setup/configuration有关。所以我们通过重命名迁移文件将它们向上移动,例如:

2019_08_05_104213_create_financial_years_table

2016_08_31_104213_create_financial_years_table

在那之后,我们继续前进,在某个阶段我们制作了更多的迁移文件,然后运行 php artisan migrate。但是它出现了错误:

Base table or view already exists: ... Table 'financial_years' already exists

因此,我们尝试删除基数 table(在本例中为:financial_years),然后从migrations table 也是。

但是php artisan migrate一次又一次地出现同样的错误。我们检查了整个数据库,但没有发现 index 或 table of financial_years.

已知补救措施,但是

我们知道,我们可以 运行 php artisan migrate:refresh 进行新的迁移。但是我们数据库中的数据很重要,我们现在不想弄乱这些数据。我们可能会在进行生产时进行新的迁移,但不是现在。

在这种情况下,我们如何进行 Laravel 迁移?

虽然我们还不知道问题的原因,但我们实际上陷入了困境。在这片贫瘠的土地上,我们的一位同事(Mr. Shakhawat Hossain)想出了一个不同的解决办法:

  • 我们恢复了数据库 table financial_years,并将 migrations table 恢复到以前的状态。 (意味着我们回滚到默认状态)
  • 我们再剪切 (Ctrl+x or +x) 导致问题的迁移文件,从 database/migrations/ 到其他地方
  • 然后运行php artisan migrate。它成功运行所有新迁移,没有任何错误。
  • 然后我们将移动的迁移文件带回之前所在的位置

问题暂时解决。

但最终的解决方案是 php artisan migrate:refresh - 我们已获悉。但是你知道,这不是我们的情况 只是 现在。

请先检查数据库中的迁移 table 是否存在同名迁移,如果存在则删除它并再次 运行。 您可以尝试在迁移中添加:

Schema::drop('financial_years');

您的迁移 table 有一个旧条目,名称为您的旧文件 2019_08_05_104213_create_financial_years_table。现在,由于您更改了文件名并且 Laravel 认为这是一个新的迁移。所以它也运行那个文件。

快速修复是编辑迁移中的文件名table

Laravel 假定您正在尝试 运行 新迁移。当它 运行 时,它发现迁移 table 中的条目存在,因为您只更改了名称。 'php artisan migrate:reset' 将是最好的解决方案,但由于您不想丢失数据,因此您必须手动修复迁移 table 中的文件名。

当您 运行 迁移命令 php artisan migrate 时会抛出异常,因为迁移实际上首先需要父 table,然后是子 table,当存在关系时在他们之间。

解决方案

在你的情况下,

  • /migrations/ 目录中重命名您的迁移文件,以便父迁移 table 时间戳出现在子 table 的迁移之前,并且
  • 使用以下命令更新 migrations table(在 运行 之前,找到相应的行 ID 并将其放入 ?
UPDATE `migrations` SET `migration`='2016_08_31_104213_create_financial_years_table' WHERE `id`= ?;