向已有数据的表B新增主键列:方案咨询及可行性确认
方案可行性及实操建议
你的这个方案完全可行,而且是针对已有数据的表做主键变更非常稳妥的路径,具体实操可以按以下步骤来,同时注意几个细节:
- 先给表
B新增对应列:列的类型、长度、约束(比如非空)要和源表A的新主键列完全对齐,要是源表是自增主键,注意别给表B的新增列开本地自增,避免和同步过来的数据冲突 - 给新增列创建唯一索引:这一步能提前帮你校验数据的唯一性,避免后续设主键时因为重复值报错,而且在同步数据的过程中,唯一索引还能实时约束新写入的数据符合主键要求
- 同步历史数据到新增列:等所有已有数据都同步完毕后,查一下
SELECT COUNT(*) FROM B WHERE 新增列 IS NULL确认没有遗漏,同时检查有没有重复值(比如SELECT 新增列, COUNT(*) FROM B GROUP BY 新增列 HAVING COUNT(*) > 1) - 把新增列设为主键:这一步大部分数据库会直接复用之前创建的唯一索引当主键索引,不用额外重建索引,能节省不少时间
额外提醒:
- 尽量选业务低峰期操作,避免DDL和数据同步影响正常业务
- 如果是数据量很大的表,新增列和建索引可能会锁表,看看你的数据库支不支持在线DDL(比如MySQL用
ALTER TABLE ... ALGORITHM=INPLACE),能大幅减少锁表时间 - 设主键前一定要确认新增列没有空值和重复值,不然操作会直接失败
内容的提问来源于stack exchange,提问作者pawan rakesh
相关产品推荐
相关产品推荐

