回滚上一次迁移需先查migrations表确认最高batch值是否≥1,再执行php artisan migrate:rollback(等价--step=1);若batch全为0则迁移未登记,需补录或重跑。

报错后想回滚上一次迁移,核心就两点:先确认状态是否可回滚,再执行对应命令。Laravel 不会回滚“没被正式登记”的迁移,所以第一步永远是查 migrations 表的真实记录。
先看迁移状态,别急着回滚
运行以下命令,查看哪些迁移已执行、batch 值是多少:
php artisan migrate:status
重点看最后一行(最新执行的):
- 如果 batch 列全是 0,说明这些迁移没被 Laravel 正式登记——可能是手动执行过 SQL、连错了数据库、或用了
--force跳过检查。此时migrate:rollback一定没反应,得先补录或重跑迁移。 - 如果最高 batch 是 3,那
migrate:rollback默认就撤 batch=3 的那一批(哪怕它包含 4 个迁移文件)。 - 注意:batch 是按
php artisan migrate执行次数隐式生成的,不是按文件数算的。
回滚上一次迁移(默认行为)
直接运行:
php artisan migrate:rollback
它等价于 --step=1,只撤 batch 值最大的那一批。只要 migrate:status 显示最高 batch ≥ 1,这个命令就会触发对应所有迁移文件里的 down() 方法。
常见失败原因:
-
down()方法里用了Schema::drop('table')但表不存在 → 改成Schema::dropIfExists('table') - 外键约束阻止删表 → 在
down()中先删外键或用DB::statement()绕过 - 类找不到(如删了迁移文件又回滚)→ 先运行
composer dump-autoload
只想撤某几个特定迁移文件?得手动改表
Laravel 没有 --path 或 --name 回滚参数。所谓“指定文件回滚”,本质是临时调整它们在 migrations 表中的 batch 值:
- 查出目标迁移记录:
SELECT id, batch, migration FROM migrations WHERE migration LIKE '%create_users_table%'; - 把它们的
batch改成一个未使用的数字(比如 999):UPDATE migrations SET batch = 999 WHERE id IN (123, 456); - 执行
php artisan migrate:rollback --step=1→ 它会去找 batch=999 的那批并回滚 - 回滚完立刻把 batch 改回原值,否则下次
migrate会跳过或重复执行
别踩这些坑
migrate:fresh 和 migrate:reset 不是“精准回滚”工具:
-
migrate:fresh:不走任何down(),直接删库重建,风险极高 -
migrate:reset:从最大 batch 开始逐个执行所有down(),等于全清空 -
--force只跳过提示,不校验down()是否安全 —— 生产环境禁用
真正可控的只有 --step,但它管的是批次,不是文件。











