修改mysql表唯一键操作规范
背景
在数据开发过程中,我们要求创建的mysql表都要有业务唯一键来保证数据不重复,但由于对数据理解不够,业务有变化等原因,先前设置的唯一键不合理,需要对其修改
为了减少修改唯一键过程中产生事故、返工能情况,提高工作效率,故制定本操作规范,望开发人员严格执行!
当然,此规范针对的是业务上在用的表的操作规范,若是业务上还没有用的表,直接建新表吧
在原表操作
说明:下述中的"new_unique_id"是举例,实际操作时按已有规范命名
第一步:确定唯一键字段新的赋值逻辑、赋新值后重复数据应该怎么选择
产品经理、开发人员一起讨论、预研确定;
重复数据选择策略有(供参考):
-
保留最新的一条
-
保留最先入库的一条
-
保留信息最全、最准确的一条
调整唯一键要遵守的规范:
-
唯一键是一个字段的情况,不改变唯一键设置,只对其重新赋值
-
唯一键是组合唯一键,增加新的字段作为唯一键并替换
第二步:增加一个新的字段(new_unique_id)存放唯一键的新值,对其建普通索引
第三步:停掉所有对该表的写操作程序,如果有根据当前时间戳自动更新的字段(on update CURRENT_TIMESTAMP),关掉该字段的自动更新功能
关掉自动更新功能的SQL语句:
alter table 表名 modify 列名 字段类型 default CURRENT_TIMESTAMP comment 字段注释;
即去掉字段设置中的 "on update CURRENT_TIMESTAMP",该操作瞬间完成
第四步:刷全表对new_unique_id赋值
第五步:如果有根据当前时间戳自动更新的字段(on update CURRENT_TIMESTAMP),开启该字段的自动更新功能
第六步:找出重复的new_unique_id,并根据第一步确定的重复数据选择规则确定要废弃的数据记录
第七步:对要废弃的数据在表中做标记,若有关联子表,子表中的关联数据也要做标记
可以通过主键或原有的唯一键确定具体哪条数据要标记为废弃
第八步:若该表有同步更新其他业务表(对外输出给客户、其他业务层表),则要等待其他表获取到标记的废弃数据时再进行下一步;若没有其他表需要同步,跳过此步骤
第九步:将标记为废弃的数据备份到新的临时表,然后将其从表中物理删除,若有关联子表,子表中的关联数据也要同样操作
物理删除数据是防止新生成的new_unique_id值与原先的唯一键值冲突
第十步:通知第八步中的下游表做同步操作,若没有下游表跳过此步骤
下游表的操作可以有两个选择:
-
标记为废弃的数据物理删除
-
删除原有的唯一键索引,根据主键更新(推荐)
第十一步:若不改变唯一键字段:将表中唯一键的值更新为new_unique_id的值(此时new_unique_id没有重复值),并删除new_unique_id字段
在替换唯一键值的过程中可能会有新值与旧值的冲突,有冲突可以跳过,多刷几轮
第十二步:若将new_unique_id作为新的唯一键:删除原有的唯一索引,在new_unique_id字段上建唯一索引
若下游表在第十步删除了原有唯一索引,此步骤不影响下游表,若没有,下游表做同样操作
第十三步:修改更新表程序的唯一键生成逻辑,并重启程序恢复数据更新
原有表外操作
待补充