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 indexuser_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 无法回滚迁移