【问题标题】:laravel migrate:rollback wronglaravel 迁移:回滚错误
【发布时间】: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');
        });
    }
}

【问题讨论】:

    标签: php mysql laravel laravel-5


    【解决方案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 手册:

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

        【讨论】:

          猜你喜欢
          • 2023-04-06
          • 2021-07-01
          • 2017-04-18
          • 2014-12-06
          • 1970-01-01
          • 2017-05-10
          • 2017-07-31
          • 1970-01-01
          • 2016-10-18
          相关资源
          最近更新 更多