2016-03-20 30 views
8

tôi giữ lấy điều này trong khi chạy php artisan migrateDrop Unique Index Laravel 5

SQLSTATE [42000]: Cú pháp lỗi hoặc vi phạm truy cập: 1091 không thể thả 'email'; kiểm tra cột/khóa đó tồn tại

Trong khi tôi thấy email đó tồn tại trên cơ sở dữ liệu của mình.

enter image description here


kịch bản chuyển đổi của tôi. Tôi đã cố gắng bỏ ràng buộc duy nhất.

<?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'); 

     }); 
    } 

} 

Tôi quên xóa mọi bộ nhớ cache?

Bất kỳ gợi ý nào cho tôi?

+0

Bạn đang cố gắng bỏ chỉ mục duy nhất hoặc cột email hoàn toàn?Ngoài ra, chỉ cần một head-up, chức năng xuống của bạn cũng cố gắng để thả chỉ số, thay vì tái tạo nó. – stratedge

+0

Tôi chỉ muốn bỏ chỉ mục duy nhất. – ihue

Trả lời

20

Khi giảm chỉ mục, Laravel sẽ cho rằng tên đầy đủ của chỉ mục được cung cấp.

Bạn có thể kiểm tra cơ sở dữ liệu để biết tên đầy đủ của chỉ mục, nhưng nếu khóa được tạo bởi lần di chuyển Laravel trước đó, tên của nó phải tuân theo một quy ước đặt tên đơn giản.

Dưới đây là những gì các documentation đã nói về quy ước đặt tên của nó (như của v5.2):

Theo mặc định, Laravel tự động gán một tên hợp lý để các chỉ số. Đơn giản chỉ cần nối tên bảng, tên của cột được lập chỉ mục và loại chỉ mục.

Tôi đoán đây là lý do bạn gặp lỗi. Không có chỉ mục email, nhưng có thể là chỉ mục guests_email_unique.

Give di cư này một shot:

<?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'); 

     }); 
    } 

} 

Tôi hiểu đó là một chút bối rối khi tạo ra một chỉ số bạn chỉ định tên cột, nhưng khi thả các chỉ số sau đó bạn cần phải cung cấp tên đầy đủ của chỉ số.

Xin lưu ý rằng tôi cũng đã điều chỉnh phương thức down(), để nó hoàn nguyên việc giảm chỉ mục duy nhất bằng cách thêm lại.

+0

Bạn đã cứu người bạn đời của tôi :) – ihue

+0

Rất vui được phục vụ! – stratedge

7

By official documentation Bạn có thể thấy như sau:

Nếu bạn vượt qua một loạt các cột vào một phương pháp mà giảm chỉ số, các tên chỉ số thông thường sẽ được tạo ra dựa trên tên bảng, cột và kiểu chìa khóa :

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



Bạn có thể thả nó chỉ đơn giản là sử dụng [] xung quanh tên trường:

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

Đây là câu trả lời tốt hơn trong quan điểm của tôi vì nó cho phép Laravel xác định tên khóa bằng cách sử dụng quá trình tạo ra nó. – Fireynis

+0

@Fireynis cảm ơn bạn vì ý kiến ​​của bạn (; – num8er