Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
K
kb
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 2
    • Issues 2
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • Operations
    • Operations
    • Incidents
  • Analytics
    • Analytics
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Commits
  • Issue Boards
Collapse sidebar
  • granite
  • kb
  • Wiki
    • Working_standard
  • alter_mysql_unique

alter_mysql_unique · Changes

Page history
update: 修改唯一键操作规范 authored May 24, 2022 by 宋志鹏's avatar 宋志鹏
Hide whitespace changes
Inline Side-by-side
Showing with 81 additions and 0 deletions
+81 -0
  • working_standard/alter_mysql_unique.md working_standard/alter_mysql_unique.md +81 -0
  • No files found.
working_standard/alter_mysql_unique.md 0 → 100644
View page @ fda77de5
# 修改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
Clone repository
  • README
  • basic_guidelines
  • basic_guidelines
    • basic_guidelines
    • dev_guide
    • project_build
    • 开发流程
  • best_practice
  • best_practice
    • AlterTable
    • RDS
    • azkaban
    • create_table
    • design
    • elasticsearch
    • elasticsearch
      • ES运维
    • logstash
View All Pages