2016-03-20 105 views
8

我一直得到這一點的同時運行php artisan migrate刪除唯一索引Laravel 5

SQLSTATE [42000]:語法錯誤或訪問衝突:1091不能DROP '電子郵件';檢查列/密鑰是否存在

雖然我看到電子郵件存在於我的數據庫中。

enter image description here


我的遷移腳本。我試圖放棄唯一的約束。

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class AlterGuestsTable3 extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 
      $table->dropUnique('email'); 

     }); 

    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 

      $table->dropUnique('email'); 

     }); 
    } 

} 

我忘了清除任何緩存嗎?

對我有什麼提示?

+0

您是否試圖完全刪除唯一索引或電子郵件列?此外,只是單挑,您的下拉功能也會嘗試刪除索引,而不是重新創建索引。 – stratedge

+0

我只想刪除唯一索引。 – ihue

回答

20

當刪除索引時,Laravel會期望給出索引的全名。

您可以檢查數據庫中索引的全名,但如果鍵是由以前的Laravel遷移生成的,則其名稱應符合單一的簡單命名約定。

這裏是什麼documentation不得不說的它的命名約定(如V5.2的):

默認情況下,Laravel合理的名稱自動分配到指標。簡單地連接表名,索引列的名稱和索引類型。

我的猜測是這就是爲什麼你得到一個錯誤。沒有email索引,但可能有guests_email_unique索引。

給這個遷移一個鏡頭:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class AlterGuestsTable3 extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 
      $table->dropUnique('guests_email_unique'); 

     }); 

    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 
      //Put the index back when the migration is rolled back 
      $table->unique('email'); 

     }); 
    } 

} 

我的理解是,在創建索引時指定的列名有點混亂,但是在丟棄索引時後,你需要提供該指數的全名。

請注意,我也調整了down()方法,以便通過將其添加回去來刪除唯一索引。

+0

你救了我的人生伴侶:) – ihue

+0

很高興能成爲服務! – stratedge

7

通過official documentation你可以看到以下內容:

如果您傳遞列陣列成下降指標的方法,該 傳統的指數名稱將根據表名中產生, 列和密鑰類型:

Schema::table('geo', function ($table) { 
    $table->dropIndex(['state']); // Drops index 'geo_state_index' 
}); 



您只需簡單地使用[]周圍砸字段名稱:

Schema::table('guests', function(Blueprint $table) 
{ 
    $table->dropUnique(['email']); 
}); 
+1

在我看來,這是更好的答案,因爲它讓Laravel使用它創建它的過程來確定關鍵名稱。 – Fireynis

+0

@Fireynis感謝您的意見(; – num8er