【问题标题】:Laravel Migration: Base table or view already existsLaravel 迁移:基表或视图已经存在
【发布时间】: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 年前...
  • 是的,这绝对是“从不做”的事情。它是你的历史,如果你打破你的历史,各种可怕的事情就会开始发生。

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


【解决方案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' 将是最好的解决方案,但由于您不想丢失数据,因此您必须手动修复迁移表中的文件名。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-09-30
          • 1970-01-01
          • 2017-07-09
          • 2021-04-08
          • 1970-01-01
          • 2019-03-05
          • 2020-03-03
          相关资源
          最近更新 更多