如何确保分区表中由short_id生成的ID保持唯一性?
分区表中非自增ID重复问题的解决方法
问题场景
当对表执行如下List或Range分区操作后,表中由short_id生成的非自增id会丢失唯一性(不同分区可能出现重复的id值):
List分区示例
alter table tbl_example partition by list columns(platform) ( PARTITION p1 VALUES IN ('platform1'), PARTITION p2 VALUES IN ('platform2'), PARTITION p3 VALUES IN ('platform3'), PARTITION p4 VALUES IN ('platform4') );
Range分区示例
alter table tbl_example partition by range(TO_DAYS(createdAt)) ( partition r0 values less than (TO_DAYS('2022-08-01')), partition r1 values less than (maxvalue) );
解决方法
这里提供两种可行的方案来避免id重复:
方案一:新增带唯一约束的冗余列
新增一个与原short_id取值完全一致的列(比如命名为unique_id),插入数据时同时将ID值写入id列和这个新增列,并给新增列添加唯一约束。这种方法能从数据库层面直接阻止重复ID插入,唯一的代价是略微增加表体积,但实际影响极小。方案二:插入前校验ID存在性
在插入数据前先查询表中是否已存在相同的id值,确认不存在再执行插入。不过这种方法每次插入都要额外执行一次查询,在高并发、高插入量的业务场景下,可能会带来明显的性能延迟,不建议在核心业务中使用。
内容的提问来源于stack exchange,提问作者jeqwdkc
相关产品推荐
相关产品推荐

