Skip to main content

什么是迁移

迁移就像是数据库的版本控制。 团队可以共享和管理应用的数据库结构定义。 你或许有过在拉取代码后被要求「请在本地数据库手动加一列」的经历。迁移正好解决了这类问题。 迁移文件存放在 database/migrations 目录,文件名包含时间戳,Laravel 据此决定执行顺序。

创建迁移文件

使用 make:migration Artisan 命令:
Laravel 会根据迁移名推测表名并生成合适的骨架。create_posts_table 就会预置创建 posts 表的代码。

迁移结构

迁移类包含 up 与 down 两个方法:
  • up:向数据库添加表、列、索引。
  • down:撤销 up 的操作,用于回滚。

常见列定义方法

Blueprint 类内置多种列类型。

列修饰符

可以链式添加修饰符:

向量列与索引

vector 方法会创建一个用于存储嵌入向量的 vector 列。请在 dimensions 中指定所用嵌入服务的输出维度。
向量列可用于启用 pgvector 扩展的 PostgreSQL 连接,以及 MariaDB 11.7 及以上版本。在 PostgreSQL 上,请在创建向量列之前启用 pgvector。
要加速向量相似度检索,可以在 vector 列上添加 index。该索引使用余弦距离。
如需删除现有的向量索引,请使用 dropVectorIndex。

在线创建索引

在大表上创建索引时,通常会在构建索引期间锁定表,导致读写操作被阻塞。在 MySQL 中,为索引或外键定义添加 inplace 修饰符,即可使用 INPLACE 算法执行操作。
inplace 可以与 lock 修饰符组合使用,用于指定操作过程中的表锁定方式。指定 none 时,在 MySQL 允许的操作中可以继续进行读写。
此功能仅适用于 MySQL。请参考 MySQL 在线 DDL 操作文档,确认你使用的操作是否支持 INPLACE 算法以及所指定的锁模式。若在外键操作中使用 inplace,需要预先禁用外键约束。

执行迁移

用 migrate 命令运行未执行的迁移。
查看执行情况:
在生产环境执行迁移会出现确认提示。若需跳过可加 --force,但因为有可能丢失数据请谨慎操作。

回滚

回滚最近一次迁移批次:
按步数回滚:
回滚全部并重新运行:
migrate:refresh 会重建所有表,既有数据会丢失,适合开发中的数据库重置。

实战示例:创建 posts 表

以博客文章的 posts 表为例。

1. 生成迁移

2. 编辑迁移

打开 database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php:

3. 执行迁移

数据库中会创建 posts 表。

4. 后期追加列

后期添加列时不要修改已有迁移,而是新建迁移:
尽量不要修改已存在的迁移文件,否则会破坏与其他成员或生产环境的一致性。所有更改都以新迁移的形式添加。

迁移事件

每次迁移操作会派发事件,都继承 Illuminate\Database\Events\MigrationEvent。 例如可监听 MigrationsEnded 在迁移完成后清理缓存:

下一步

数据库填充

了解如何为迁移创建的表填充示例数据。

Eloquent 入门

学习通过 Eloquent ORM 操作迁移创建的表。
最后修改于 2026年9月22日