SQL表结构演进核心是新旧逻辑共存:新增字段应允许NULL并设默认值,语义变更只增不改,拆表用视图过渡,数据迁移需离线+灰度+校验,全程强调协作与回滚。
SQL表结构演进时,核心目标是新增功能不破坏旧数据、不中断线上服务、不强制要求老客户端升级。关键不在“怎么改表”,而在于“如何让新旧逻辑共存”。
加字段是最常见场景。直接加非空字段会失败(已有行无值),加可空字段又容易在代码里漏判空,引发NPE或逻辑错误。
推荐做法:
'',数字用0,时间用CURRENT_TIMESTAMP)比如原status是tinyint表示订单状态(1=待支付,2=已发货),现在要扩展成多状态机且含子状态。硬改枚举值或扩大类型风险高,易导致旧逻辑误判。
更安全的路径:
status_v2(JSON或独立状态表ID),承载新状态体系
务、第三方系统)都已下线当单表过大或职责混乱(如用户表混着地址、偏好、风控数据),需拆分。但直接切到新表,所有DAO、SQL、索引都要改,风险集中。
平滑方案:
user_profile),把新字段迁入user_full,UNION或JOIN原表+新表,保持原有查询接口不变结构变了,老数据常需转换(如把分散字段合并为JSON,或拆出外键)。不能“ALTER TABLE + UPDATE一把梭”。
稳妥节奏:
表结构演进不是技术动作,而是协作过程。DBA、后端、测试、甚至前端(如果涉及状态映射)都要对齐字段含义和生命周期。每次变更留好回滚路径,比追求“一步到位”更重要。