簡體   English   中英

Laravel遷移:基本表或視圖已存在

[英]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表恢復為其先前狀態。 (意味着我們回滾到默認狀態😀)
  • 然后,我們將導致問題的遷移文件( Ctrl + x + x剪切 (從Ctrl / x + x )到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM