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

Posted

技术标签:

【中文标题】Laravel 迁移:基表或视图已经存在【英文标题】:Laravel Migration: Base table or view already exists 【发布时间】:2019-12-30 06:38:45 【问题描述】:

背景

我们从一开始就在我们的一个项目中使用 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 迁移?

【问题讨论】:

一旦迁移在生产环境中运行,您就应该永远更改迁移(无论是名称、功能等等)。您对迁移的重新排序似乎没有改变任何东西(比如添加一些必需的外键或其他什么),所以无论如何重新排序它们是没有用的。尤其是把他们追溯到 3 年前... 是的,这绝对是“从不做”的事情。它是你的历史,如果你打破你的历史,各种可怕的事情就会开始发生。 【参考方案1】:

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

快速解决方法是编辑迁移表中的文件名

【讨论】:

【参考方案2】:

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

解决方案

在你的情况下,

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

【讨论】:

突然间,这似乎是最简单的解决方案。 :)【参考方案3】:

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

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

问题暂时解决了。

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

【讨论】:

【参考方案4】:

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

Schema::drop('financial_years');

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Laravel 迁移:基表或视图已经存在的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 错误基表或视图已存在:1050 表“用户”已存在

SQLSTATE [42S02]:未找到基表或视图:1146表'softwareproject.o_r_f_o_l_s'在laravel中不存在错误

SQLSTATE [42S02]:未找到基表或视图:1146 表 'laravel_abonamenty2.currencies' 不存在

未找到数据库异常基表或视图

如何在 laravel 中运行特定迁移 [重复]

Laravel 关于迁移的问题