数据库迁移Database Migration
你可能会说
用户表里已经有真实数据了,我要再加一个必填状态字段,应该按什么顺序改才不会让旧数据立刻报错?
把数据库结构或必要的数据转换写成有顺序、可版本化、可追踪的变更步骤。例如 users 表已经有真实用户,现在要新增必填的 status 字段。安全的迁移方案会先增加可兼容的字段、回填旧记录,检查空值已经归零,再收紧为必填,而不是直接把新约束压到旧数据上。迁移工具会记录哪些版本已执行,但迁移文件不是数据备份,也不保证每次变更都能无损回退。
也常被叫作DB MigrationSchema Migration数据库版本管理数据库表迁移
数据库迁移按版本变更结构的全过程
idnamestatus
101张三
NULL102李四
NULL103王五
NULL- 0001_init.sql已应用
- 直接 ADD status NOT NULL旧记录不满足约束,迁移被拒绝
- 0002_add_status_nullable.sql尚未执行
- 0003_backfill_status.sql尚未执行
执行记录
migration history: 0001_init可观察证据执行结果明确指出旧记录的 status 为空,不能直接增加非空约束
先确认存量数据是否满足新规则,再决定迁移顺序;不要把失败描述成数据库“崩溃”。
已有数据时,必填字段要怎样加进去
直接加必填约束,旧记录可能不满足:users 表中的旧记录原本没有 status。直接要求 status NOT NULL,迁移可能因为旧行仍为空而失败;即使数据库允许同时填默认值,也要先确认这个默认值符合业务含义,不能随便猜一个状态。
先兼容,再回填,最后收紧:第一步先新增允许为空的 status,让新旧版本应用都能继续运行;第二步按明确规则为旧记录回填合法状态,并记录处理行数;第三步确认 NULL 数量为 0,再增加 NOT NULL 约束。
用数据结果和新旧应用共同验收:同时查看迁移版本、执行日志、回填行数和空值查询;只要仍有 status 为空,就不能收紧约束。还要在测试环境确认旧用户可读取、新用户能写入合法状态,并检查过渡期的新旧应用。迁移记录不是数据备份,破坏性转换前仍要准备恢复方案。
你可以这样告诉 AI Agent
users 表已经有真实数据,我要新增必填的 status 字段。请先确认项目使用的迁移工具、现有取值和旧版应用是否兼容,再按“先加可空字段、回填合法状态、确认 NULL 数量为 0、最后加 NOT NULL”的顺序生成迁移。先在测试环境执行,并告诉我迁移版本、回填行数、空值检查和旧版读写结果;不要把 down 脚本当成备份。
接下来学什么
延伸阅读 · 权威出处
快速练习