Laravel迁移必须通过php artisan make:migration生成文件并执行php artisan migrate,禁止跳过校验或手动操作数据库,否则破坏migrations表一致性,导致回滚失败与协作事故。

直接执行迁移命令就能创建表或修改结构,但必须先写好迁移文件,且不能跳过 php artisan migrate 的校验逻辑。
如何生成并运行新建数据表的迁移文件
新建表必须通过 php artisan make:migration 生成文件,再在 up() 方法里用 Schema::create() 定义字段。Laravel 不允许直接执行 SQL 创建表——它依赖迁移文件记录版本和回滚能力。
- 运行
php artisan make:migration create_users_table生成空迁移文件 - 编辑该文件,在
up()中调用Schema::create('users', function (Blueprint $table) { ... }) - 字段定义用
$table->id()、$table->string('name')等方法,不是原生 SQL - 确认无误后执行
php artisan migrate,Laravel 自动记录到migrations表
如何安全地修改已有数据表字段(比如加字段、改类型)
不能直接用 ALTER TABLE 手动操作,否则 migrations 表会丢失记录,后续部署或回滚会出错。所有变更都得走新迁移文件 + Schema::table()。
- 运行
php artisan make:migration add_email_to_users_table(命名需体现意图) - 在
up()中写Schema::table('users', function (Blueprint $table) { $table->string('email')->after('name'); }); - 如果要改字段类型(如
string改text),需确保数据库驱动支持change(),MySQL 需装doctrine/dbal扩展 - 执行
php artisan migrate,Laravel 检查migrations表后只运行未记录的迁移
常见报错:‘SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table’
这通常发生在迁移中定义了外键,但被引用的表还没创建,或迁移执行顺序错乱。Laravel 按文件名前缀(时间戳)排序执行,不是按文件创建顺序。
- 检查迁移文件名是否为标准格式:
2023_05_12_100000_create_posts_table.php - 外键关联的表迁移必须在当前迁移之前执行,比如
posts表引用users,则create_users_table的时间戳必须更早 - 不要手动修改迁移文件名中的时间戳来“抢序”,会导致本地与生产环境不一致
- 若已出错,先用
php artisan migrate:rollback --step=1回退一步,再修复依赖关系重新迁移
为什么不能跳过迁移直接操作数据库?
因为 migrations 表是 Laravel 迁移系统唯一的状态源。删掉某条记录、手动建表、或用其他工具改结构,都会让 php artisan migrate:status 显示异常,rollback 失效,团队协作时极易引发线上事故。
-
php artisan migrate:status查看哪些迁移已执行、哪些待运行 -
php artisan migrate:fresh仅用于本地开发重置,它会DROP所有表,线上绝对禁用 - 生产环境修改字段,必须走新增迁移文件,哪怕只是加个
nullable()
php artisan make:migration add_status_to_posts_table
// 编辑该文件:
public function up(MigrationBuilder $migration)
{
Schema::table('posts', function (Blueprint $table) {
$table->string('status')->default('draft')->after('title');
});
}
// 再运行:
php artisan migrate
真正麻烦的从来不是命令怎么敲,而是迁移文件写完之后,有没有人记得把它提交进 Git、有没有人在上线前漏跑那一条 migrate、以及——有没有人偷偷绕过它直接连上数据库改了字段。










