migrate:fresh 是暴力重装,直接删库重建所有表,不依赖 migrations 表记录;migrate:refresh 是有序复位,先回滚再重跑,严格依赖迁移记录。

migrate:fresh 直接删库重建,migrate:refresh 先回滚再重跑——两者目标相似,但底层逻辑和适用场景不同。
migrate:fresh:清空 + 重装,不依赖历史状态
该命令会物理删除数据库中所有业务表(跳过 migrations 和 failed_jobs 表),然后扫描 database/migrations/ 下所有合法迁移文件(含框架自带的如 create_personal_access_tokens_table),按时间戳顺序全部执行一次。
- 不检查
migrations表记录,哪怕你手动删过它,也能继续运行 - 适合本地开发环境快速重置结构,尤其是初始搭建或表关系混乱时
- 若需填充测试数据,可加
--seed参数:php artisan migrate:fresh --seed - 外键约束默认禁用,但若迁移中显式调用
Schema::enableForeignKeyConstraints(),仍可能因执行顺序问题失败(例如 users 表迁移时间戳晚于引用它的表)
migrate:refresh:回滚 + 重播,严格依赖迁移记录
它先调用 migrate:rollback,逐条执行已记录在 migrations 表中的 down() 方法,再重新运行所有 up() 方法。本质是“还原到初始态,再重走一遍”。
- 必须确保
migrations表完整且记录准确,否则会中断或出错 - 不会删掉未被记录的表(比如手动创建的表、或迁移失败后残留的半成品表)
- 支持指定步数回滚:
php artisan migrate:refresh --step=2只回滚最近两次再重放 - 同样可结合 Seeder:
php artisan migrate:refresh --seed
关键区别一句话总结
fresh 是“暴力重装”,不管记录;refresh 是“有序复位”,全靠记录。 生产环境都禁用,本地开发选 fresh 更彻底,调试迁移逻辑本身(比如 down 方法是否可靠)则用 refresh 更合适。











