Laravel 迁移:基础 table 或视图已存在
Laravel Migration: Base table or view already exists
背景
我们从一开始就为我们的一个项目使用 Laravel (5.8) 迁移。在开发过程中,我们进行了一些迁移。一段时间后,我们发现,一些迁移与setup/configuration有关。所以我们通过重命名迁移文件将它们向上移动,例如:
2019_08_05_104213_create_financial_years_table
到
2016_08_31_104213_create_financial_years_table
在那之后,我们继续前进,在某个阶段我们制作了更多的迁移文件,然后运行 php artisan migrate
。但是它出现了错误:
Base table or view already exists: ... Table 'financial_years' already exists
因此,我们尝试删除基数 table(在本例中为:financial_years
),然后从migrations
table 也是。
但是php artisan migrate
一次又一次地出现同样的错误。我们检查了整个数据库,但没有发现 index
或 table of financial_years
.
已知补救措施,但是
我们知道,我们可以 运行 php artisan migrate:refresh
进行新的迁移。但是我们数据库中的数据很重要,我们现在不想弄乱这些数据。我们可能会在进行生产时进行新的迁移,但不是现在。
在这种情况下,我们如何进行 Laravel 迁移?
虽然我们还不知道问题的原因,但我们实际上陷入了困境。在这片贫瘠的土地上,我们的一位同事(Mr. Shakhawat Hossain)想出了一个不同的解决办法:
- 我们恢复了数据库 table
financial_years
,并将 migrations
table 恢复到以前的状态。 (意味着我们回滚到默认状态)
- 我们再剪切 (Ctrl+x or ⌘+x) 导致问题的迁移文件,从
database/migrations/
到其他地方
- 然后运行
php artisan migrate
。它成功运行所有新迁移,没有任何错误。
- 然后我们将移动的迁移文件带回之前所在的位置
问题暂时解决。
但最终的解决方案是 php artisan migrate:refresh
- 我们已获悉。但是你知道,这不是我们的情况 只是 现在。
请先检查数据库中的迁移 table 是否存在同名迁移,如果存在则删除它并再次 运行。
您可以尝试在迁移中添加:
Schema::drop('financial_years');
您的迁移 table 有一个旧条目,名称为您的旧文件 2019_08_05_104213_create_financial_years_table
。现在,由于您更改了文件名并且 Laravel 认为这是一个新的迁移。所以它也运行那个文件。
快速修复是编辑迁移中的文件名table。
Laravel 假定您正在尝试 运行 新迁移。当它 运行 时,它发现迁移 table 中的条目存在,因为您只更改了名称。
'php artisan migrate:reset' 将是最好的解决方案,但由于您不想丢失数据,因此您必须手动修复迁移 table 中的文件名。
当您 运行 迁移命令 php artisan migrate
时会抛出异常,因为迁移实际上首先需要父 table,然后是子 table,当存在关系时在他们之间。
解决方案
在你的情况下,
- 在
/migrations/
目录中重命名您的迁移文件,以便父迁移 table 时间戳出现在子 table 的迁移之前,并且
- 使用以下命令更新
migrations
table(在 运行 之前,找到相应的行 ID 并将其放入 ?
)
UPDATE `migrations` SET `migration`='2016_08_31_104213_create_financial_years_table' WHERE `id`= ?;
背景
我们从一开始就为我们的一个项目使用 Laravel (5.8) 迁移。在开发过程中,我们进行了一些迁移。一段时间后,我们发现,一些迁移与setup/configuration有关。所以我们通过重命名迁移文件将它们向上移动,例如:
2019_08_05_104213_create_financial_years_table
到
2016_08_31_104213_create_financial_years_table
在那之后,我们继续前进,在某个阶段我们制作了更多的迁移文件,然后运行 php artisan migrate
。但是它出现了错误:
Base table or view already exists: ... Table 'financial_years' already exists
因此,我们尝试删除基数 table(在本例中为:financial_years
),然后从migrations
table 也是。
但是php artisan migrate
一次又一次地出现同样的错误。我们检查了整个数据库,但没有发现 index
或 table of financial_years
.
已知补救措施,但是
我们知道,我们可以 运行 php artisan migrate:refresh
进行新的迁移。但是我们数据库中的数据很重要,我们现在不想弄乱这些数据。我们可能会在进行生产时进行新的迁移,但不是现在。
在这种情况下,我们如何进行 Laravel 迁移?
虽然我们还不知道问题的原因,但我们实际上陷入了困境。在这片贫瘠的土地上,我们的一位同事(Mr. Shakhawat Hossain)想出了一个不同的解决办法:
- 我们恢复了数据库 table
financial_years
,并将migrations
table 恢复到以前的状态。 (意味着我们回滚到默认状态) - 我们再剪切 (Ctrl+x or ⌘+x) 导致问题的迁移文件,从
database/migrations/
到其他地方 - 然后运行
php artisan migrate
。它成功运行所有新迁移,没有任何错误。 - 然后我们将移动的迁移文件带回之前所在的位置
问题暂时解决。
但最终的解决方案是 php artisan migrate:refresh
- 我们已获悉。但是你知道,这不是我们的情况 只是 现在。
请先检查数据库中的迁移 table 是否存在同名迁移,如果存在则删除它并再次 运行。 您可以尝试在迁移中添加:
Schema::drop('financial_years');
您的迁移 table 有一个旧条目,名称为您的旧文件 2019_08_05_104213_create_financial_years_table
。现在,由于您更改了文件名并且 Laravel 认为这是一个新的迁移。所以它也运行那个文件。
快速修复是编辑迁移中的文件名table。
Laravel 假定您正在尝试 运行 新迁移。当它 运行 时,它发现迁移 table 中的条目存在,因为您只更改了名称。 'php artisan migrate:reset' 将是最好的解决方案,但由于您不想丢失数据,因此您必须手动修复迁移 table 中的文件名。
当您 运行 迁移命令 php artisan migrate
时会抛出异常,因为迁移实际上首先需要父 table,然后是子 table,当存在关系时在他们之间。
解决方案
在你的情况下,
- 在
/migrations/
目录中重命名您的迁移文件,以便父迁移 table 时间戳出现在子 table 的迁移之前,并且 - 使用以下命令更新
migrations
table(在 运行 之前,找到相应的行 ID 并将其放入?
)
UPDATE `migrations` SET `migration`='2016_08_31_104213_create_financial_years_table' WHERE `id`= ?;