Laravel迁移:基本表或视图已经存在

时间:2019-08-26 04:13:38

标签: php laravel laravel-5.8 laravel-migrations artisan-migrate

背景

从一开始,我们就在其中一个项目中使用Laravel(5.8)迁移。在开发过程中,我们进行了一些迁移。一段时间后,我们发现某些迁移与设置/配置有关。因此,我们通过重命名迁移文件来将它们上移,例如:

2019_08_05_104213_create_financial_years_table

2016_08_31_104213_create_financial_years_table

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

  

基本表或视图已存在:...表'financial_years'已存在

因此,我们尝试删除基表(在这种情况下为financial_years),然后也从migrations表中删除了提及“ ... financial_years ...”的行。

但是php artisan migrate一次又一次出现相同的错误。我们检查了整个数据库,但没有找到indexfinancial_years的表。

已知疗法,但是

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

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

5 个答案:

答案 0 :(得分:3)

您的迁移表按旧文件2019_08_05_104213_create_financial_years_table的名称包含一个旧条目。现在,由于您更改了文件名,Laravel认为这是一个新的迁移。因此它也运行该文件。

快速解决方案是还 在迁移表中编辑文件名

答案 1 :(得分:1)

当您运行迁移命令php artisan migrate时会引发异常,因为迁移实际上首先需要父表,然后在它们之间存在关系时才需要子表。

解决方案

就您而言,

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

答案 2 :(得分:0)

尽管我们尚不知道问题的原因,但我们实际上陷于茫茫荒野。在这片贫瘠的土地上,我们的一位同事(Shakhawat Hossain先生)提出了另一种解决方案:

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

问题现在已经解决。

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

答案 3 :(得分:0)

请首先在数据库的迁移表中检查迁移是否具有相同的名称(如果已经存在),则将其删除并再次运行。 您可以尝试添加迁移:

Schema::drop('financial_years');

答案 4 :(得分:0)

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