![](/img/trans.png)
[英]Symfony 5: Base table or view already exists: 1050 Table 'migration_versions' already exists
[英]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
表恢复为其先前状态。 (意味着我们回滚到默认状态😀) 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.