laravel migrate:回滚错误

时间:2016-10-26 13:52:01

标签: php mysql laravel laravel-5

Laravel版本5.1.43(LTS)

我在终端中使用php artisan migrate:rollback然后返回错误消息。但数据库已更改。然后我再次重新输入此命令,没有错误消息。

有人可以帮我解决这个问题吗?

  

[照亮\数据库\ QueryException]   SQLSTATE [42000]:语法错误或访问冲突:1091不能DROP'user_id';检查列/密钥是否存在(SQL:alter table crm_user drop index user_id

     

[PDOException]   SQLSTATE [42000]:语法错误或访问冲突:1091无法DROP'user_id';检查列/密钥是否存在

我的迁移代码

public function down()
{
    if (Schema::hasColumn('crm_user', 'user_id')) {
        Schema::table('crm_user', function (Blueprint $table) {
            $table->dropColumn('user_id');
            $table->dropIndex('user_id');
        });
    }
}

3 个答案:

答案 0 :(得分:7)

删除列后,您的索引会自动删除。因此,当您尝试单独删除索引时,您会收到它不存在的错误。

所以要么交换订单,要先放弃索引:

$table->dropIndex('user_id');
$table->dropColumn('user_id');

或者只是放弃列,不要担心索引。

来自MySQL手册:

  

如果从表中删除列,则列也将从它们所属的任何索引中删除。如果删除构成索引的所有列,则也会删除索引。

答案 1 :(得分:0)

来自文档

  

要删除索引,必须指定索引的名称。默认情况下,Laravel会自动为索引分配合理的名称。只需连接表名,索引列的名称和索引类型。

     

从“geo”表中删除基本索引。

     

$表 - > dropIndex( 'geo_state_index');

答案 2 :(得分:0)

来自laravel documentation

$table->dropIndex(['user_id']); 

要删除索引,您需要在[]中指定列的名称。

首先你需要删除索引然后删除列。

$table->dropIndex(['user_id']);
$table->dropColumn('user_id');