繁体   English   中英

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

[英]Laravel Migration: Base table or view already exists

背景

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

2019_08_05_104213_create_financial_years_table

2016_08_31_104213_create_financial_years_table

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

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

因此,我们尝试删除基本表(在本例中为financial_years ),然后从migrations表中删除提及“ ... financial_years ...”的行。

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

已知的补救措施,但是

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

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

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

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

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

就你而言

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

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

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

问题现在解决了。

但最终的解决方案是php artisan migrate:refresh我们已获悉。 但是你要知道,这不是我们的情况下, 刚才

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

Schema::drop('financial_years');

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM