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

Last edited by songzp May 24, 2022
Page history

alter_mysql_unique

修改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字段上建唯一索引

若下游表在第十步删除了原有唯一索引,此步骤不影响下游表,若没有,下游表做同样操作

第十三步:修改更新表程序的唯一键生成逻辑,并重启程序恢复数据更新

原有表外操作

待补充

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