关于OceanBase数据库有这个问题咋解决?
问题描述:1,在主键自增的情况下,在数据库或者在代码中新增一条带主键数据,然后在新增不带主键的数据该主键则为10000+当前最大主键号
2,在1的基础上,在java同一个方法内同时执行update和insert并且insert不设置主键会出现上图错误(在方法内单独执行update和insert不会报错)
3,以上错误是基于spring-boot-starter-parent 2.5以上才会出现错误,以下则不会出现该问题文厂
OceanBase数据库中主键的自增是基于二进制分布式系统的,每个节点只负责维护自己的一部分主键值,主键的最大值是由所有节点共同维护的全局最大值。在主键自增的情况下,每次插入新记录时,系统会先检查当前最大主键值,如果当前最大主键值小于等于待插入记录的主键值,则将当前最大主键值更新为待插入记录的主键值,并将待插入记录的主键值加1作为新的最大主键值。因此,在主键自增的情况下,带主键的数据的主键值为10000+当前最大主键号,这是为了保证主键的唯一性和全局有序性。
这可能是 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开始自增长。
希望能为你提供参考。如果仍有疑问,欢迎再提。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。