|
|
# 修改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字段上建唯一索引
|
|
|
|
|
|
若下游表在第十步删除了原有唯一索引,此步骤不影响下游表,若没有,下游表做同样操作
|
|
|
|
|
|
> 第十三步:修改更新表程序的唯一键生成逻辑,并重启程序恢复数据更新
|
|
|
|
|
|
# 原有表外操作
|
|
|
|
|
|
|
|
|
待补充 |
|
|
\ No newline at end of file |