Laravel如何执行数据库迁移Migration_Laravel数据表创建与字段修改命令【说明】

12次阅读

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

Laravel如何执行数据库迁移Migration_Laravel数据表创建与字段修改命令【说明】

直接执行迁移命令就能创建表或修改结构,但必须先写好迁移文件,且不能跳过 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'); });
  • 如果要改字段类型(如 stringtext),需确保数据库驱动支持 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、以及——有没有人偷偷绕过它直接连上数据库改了字段。

text=ZqhQzanResources