能不能在原表上直接加字段,取决于旧数据是否允许为空、新字段是否参与唯一性判断,以及现有查询有没有依赖固定列顺序。如果这三点都安全,优先做增量迁移;只要有一点不满足,就应该新建扩展表而不是硬改主表,否则一次上线可能让历史记录和后台表单同时出错。
拿你手里正在用的那张资料表或后台编辑页做判断,不要先想技术选型。把准备新增的信息逐条写下来,再问三个问题:这条信息对每条记录是否都必然存在;它是否会被用来筛选、排序或做唯一性校验;同一类信息以后还会不会继续增加。
一个假设例子:某页面原本只记录客户姓名和电话,后来要记录每次沟通时间。如果直接把沟通时间加在主表,一个客户多次沟通就只能覆盖旧值;改成沟通记录从表后,主表不变,历史记录逐条保留。这个判断做完,下一步的迁移方式才确定。
在改动之前,先把现状固定下来:导出当前表结构、记录总数、每个字段的空值比例,以及后台哪些页面在读这些字段。空值比例尤其关键,它决定了新字段能不能设成必填。
具体动作是先在测试库复制一份数据,执行一次结构变更,然后跑一遍最常用的三个查询和两个后台保存操作。结果会直接影响下一步:如果保存操作报错,说明表单或写入逻辑里写死了字段列表,需要先改代码再加字段;如果查询结果条数变化,说明新字段影响了筛选条件,必须回退并重新设计。
这一步不需要停机,但要在低峰期做,并保留变更前的结构快照。快照不是备份的全部,它只保证结构能回退,数据仍按原有备份策略处理。
增量迁移成立的前提是旧数据不需要立刻补齐新字段。可以先把新字段设为可空,让新提交的数据带上它,历史记录保持为空,再按业务需要分批补录。这样上线风险最小,但会带来一个后果:依赖新字段的统计和筛选在补录完成前是不完整的。
如果业务要求新字段必须立刻参与展示或判断,就不能只靠可空字段。此时要么在迁移脚本里为历史数据填一个明确的默认值,要么把功能拆成两期,先上线采集、后上线使用。默认值不能随便填,填错会让后续判断建立在错误前提上。
还有一种情况不能照搬增量方案:当新字段要和其他字段组成联合唯一约束时,历史数据里的空值可能被不同数据库区别对待,导致约束行为不一致。遇到这种需求,应先在测试库验证空值参与约束的实际表现,再决定是否清理历史数据。
字段该放在哪张表,往往在编辑页上就能看出来。打开你正在改的那个后台页面,观察每个输入项的控制方式:单行文本框通常对应主表字段;可反复添加的区块,例如多条联系人、多组规格,对应从表;只在特定条件下才出现的选项,适合单独建配置表或保留为可空字段。
把页面上的区块和表结构一一对应后,再检查列表页和导出功能。列表页如果按主表字段排序,新增从表字段不会影响它;导出如果依赖固定列顺序,加字段后需要同步调整导出模板,否则导出内容会错位。这个检查做完,你就能列出必须同步修改的文件清单,而不是改完数据库才发现页面读不到数据。
验证不看页面能不能打开,而看三类结果是否一致:新增记录能否正确写入并读回;历史记录在页面上是否仍能正常显示和编辑;按新字段筛选时结果是否符合预期。
如果第三项对不上,先检查筛选条件是否把空值记录排除了,而不是立刻怀疑数据丢失。空值被排除是常见且合理的解释,但需要你明确这是否符合业务预期。确认之后,再决定是补录历史数据,还是调整筛选逻辑。到这里,扩展才算真正闭环,后续同类字段可以按同一套判断流程处理。