![](/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.