php artisan migrate:fresh 是最直接的重建方式,它删除所有数据表(除 migrations 表外)并重新执行全部迁移,适合本地开发快速重置,自动处理依赖与外键,加 --seed 才运行种子。

php artisan migrate:fresh 是最直接的重建方式
它会删掉所有数据表(除 migrations 表外),再重新执行全部迁移文件,适合本地开发环境快速重置。不需要手动删库或清空 migrations 表,Laravel 自动处理依赖顺序和外键约束。
- 默认不触发种子数据,加
--seed才会运行db:seed - 若报错 “cannot drop table xxx because other objects depend on it”,加
--drop-views一并清理视图 - 遇到权限不足或连接拒绝,说明当前数据库用户没有
DROP TABLE权限,不是命令问题
php artisan migrate:refresh 更适合带回滚调试的场景
migrate:refresh 先执行 migrate:rollback(回退到最后一个批次),再跑 migrate,本质是“回滚 + 重迁”。它保留了 migrations 表记录,适合想观察某次回滚是否干净、或需在中间插入自定义逻辑的情况。
- 加
--step=2可只回滚最近 2 个批次,避免全量清空 - 加
--seed同样生效,但注意:种子数据会在重迁后才插入,不是回滚期间执行 - 如果某个迁移的
down()方法写得不完整(比如漏删索引或外键),refresh可能失败,而fresh不依赖down()
修改已执行的迁移文件?别改,新建一个
已经跑过的迁移文件不能直接编辑再重跑——Laravel 会跳过它,因为 migrations 表里已标记该批次完成。强行改旧文件会导致团队成员数据库结构不一致,生产环境尤其危险。
- 新增字段、索引或约束,用
php artisan make:migration add_status_to_posts_table --table=posts - 修改字段类型(如
string→text)需先安装doctrine/dbal,否则changeColumn()不可用 - 删除字段必须显式写在新迁移的
up()里:$table->dropColumn('old_field'),down()中补回
手动 DROP DATABASE 是最后手段,慎用
当 migrate:fresh 卡在视图、存储过程或外键残留上,且你确认环境完全可控(仅本地),可考虑直接操作数据库。这绕过了 Laravel 的迁移状态管理,后续必须从头开始跑所有迁移。
- 先确认
.env中的DB_DATABASE值,再执行:mysql -u root -p -e "DROP DATABASE IF EXISTS your_db_name; CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" - 之后必须运行
php artisan migrate,不能跳过——否则migrations表为空,Laravel 不知道哪些迁移已执行 - 切勿在共享测试库或预发布环境使用此方式,没人能保证其他服务正依赖那些表
up(),哪怕没提交,下次 git pull 后再 migrate,就可能因顺序错乱导致结构异常。所以,永远把迁移当作不可变的历史快照,变更只靠新增。











