开发者社区> 问答> 正文

OceanBase数据库在主键自增的情况下带主键的数据该主键则为10000+当前最大主键号是为何?

关于OceanBase数据库有这个问题咋解决?lQLPJxASZwxOegjNBbjNCcKwtN8EFwBdxUYEsxp_NYC7AA_2498_1464.png
lQLPJxiZMJfEegjNA2vNBzewxXYmKMlorc8Esxp_N4BoAA_1847_875.png
lQLPJwrQWbIJ-gjNBO3NCa6weqHzrlncy4cEsxp_NkAMAA_2478_1261.png问题描述:1,在主键自增的情况下,在数据库或者在代码中新增一条带主键数据,然后在新增不带主键的数据该主键则为10000+当前最大主键号
2,在1的基础上,在java同一个方法内同时执行update和insert并且insert不设置主键会出现上图错误(在方法内单独执行update和insert不会报错)
3,以上错误是基于spring-boot-starter-parent 2.5以上才会出现错误,以下则不会出现该问题文厂

展开
收起
曹凯1211 2023-08-02 13:34:58 461 0
2 条回答
写回答
取消 提交回答
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    OceanBase数据库中主键的自增是基于二进制分布式系统的,每个节点只负责维护自己的一部分主键值,主键的最大值是由所有节点共同维护的全局最大值。在主键自增的情况下,每次插入新记录时,系统会先检查当前最大主键值,如果当前最大主键值小于等于待插入记录的主键值,则将当前最大主键值更新为待插入记录的主键值,并将待插入记录的主键值加1作为新的最大主键值。因此,在主键自增的情况下,带主键的数据的主键值为10000+当前最大主键号,这是为了保证主键的唯一性和全局有序性。

    2023-08-03 23:20:17
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    这可能是 OceanBase 数据库的主键生成策略导致的。

    OceanBase 的主键生成主要有两种策略:

    自增长:每个插入新记录都会自动加1,生成连续的主键值。这是默认策略。

    预分配:在一定时间内预分配一定范围的主键值,插入新记录时从这个范围内取值。

    可能你的表使用的是预分配策略。OceanBase 会预分配 10000 个主键值给该表。

    当你插入第一条记录时,OceanBase 会从 10000 开始分配主键。

    随后当你插入第二条记录时, OceanBase 会检查当前已分配完毕的主键值,然后从下一个可用的主键值开始分配。

    所以已有数据的主键值可能在 10000 附近,新插入的数据主键值可能会大于 10000。

    如果要使主键 value 从1开始连续增长,你可以:

    改用自增长策略。在创建表时指定 auto_increment 为true。
    删除表,使用自增长策略重新创建。
    通过 SQL 修改表的主键生成策略:
    sql
    Copy
    alter table your_table modify column id int auto_increment;
    删除已有数据,然后重新插入。
    通过上述方法可以修正 OceanBase 主键值,使其正常从1开始自增长。

    希望能为你提供参考。如果仍有疑问,欢迎再提。

    2023-08-02 19:41:54
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
基于阿里巴巴以及合作伙伴的最佳实践,围绕大前端、云原生领域的相关技术热点(小程序、Serverless、应用中间件、低代码、DevOps)展开行业探讨,与开发者一起探寻云原生时代应用研发的新范式。
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载