laravel 迁移:回滚错误

Posted

技术标签:

【中文标题】laravel 迁移:回滚错误【英文标题】:laravel migrate:rollback wrong 【发布时间】:2017-03-08 22:20:14 【问题描述】:

Laravel 版本 5.1.43(LTS)

我在终端中使用php artisan migrate:rollback 然后返回错误消息。但是数据库发生了变化。然后我再次重新输入这个命令没有错误信息。

谁能帮我解决这个问题?

[照亮\数据库\查询异常] SQLSTATE[42000]:语法错误或访问冲突:1091 Can't DROP'user_id';检查列/键是否存在(SQL:alter table crm_user drop index user_id

[PDO异常] SQLSTATE [42000]:语法错误或访问冲突:1091 Can't 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');
        );
    

【问题讨论】:

【参考方案1】:

来自laravel documentation

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

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

而且首先您需要删除索引然后删除列。

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

【讨论】:

【参考方案2】:

来自文档

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

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

$table->dropIndex('geo_state_index');

【讨论】:

【参考方案3】:

删除列时会自动删除索引。所以当你尝试单独删除索引时,你会得到它不存在的错误。

所以要么交换顺序,然后先删除索引:

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

或者直接删除列,不用担心索引。

来自 mysql 手册:

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

【讨论】:

以上是关于laravel 迁移:回滚错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Cartalyst Sentinel 无法回滚迁移

如何在 Laravel 中处理具有唯一性的迁移回滚中的现有记录?

Laravel 删除表,迁移不回滚

如何迁移:在 laravel 5 中回滚特定表

回滚 laravel5 中的特定迁移

Laravel 迁移重置失败