关于auto_increment的一个小问题

对于auto_increment 定义的列,是允许手动指定值插入。 但是, 如果在一个tidb server A插入了另一个tidb server B号段的值,等到B自动扩展到这个值时,就会抛出错误,再次插入时,又正常了调整正常,跳过了冲突。有什么参数调整,不抛错就直接跳过去,或者禁止手动插入值吗?

数据库貌似当前没有办法,目前常见的建议还是别显示设置自增的值。业务侧可以考虑捕获 duplicate key 错误,然后重试事务

估计只能通过开发规范或者应用层捕获异常去处理

你的意思A上已经缓存了的auto_increment,在B上执行手工插入,然后A自动增加到这个值的时候会报错,这个是肯定的,且没有什么好的解决方法,可以考虑设置AUTO_ID_CACHE为1
https://docs.pingcap.com/zh/tidb/stable/auto-increment#基本特性

1 个赞

auto_random,默认就不能显式插入,有个参数控制, auto_increment, 基于什么考虑,不限制?

ERROR 8216 (HY000): Invalid auto random: Explicit insertion on auto_random column is disabled. Try to set @@allow_auto_random_explicit_insert = true.

auto_increment 兼容 mysql 行为,auto_random 是 TiDB 自己的功能

数据库没办法避免此类问题,应用测应该可以处理。

https://docs.pingcap.com/zh/tidb/v8.0/auto-increment#auto_id_cache

https://docs.pingcap.com/zh/tidb/v8.0/auto-increment#mysql-兼容模式

用这个,搞成1,就不cache了。然后也就不会报错了吧。
当然性能也会受比较大的影响。

你可以试试好使不 :crazy_face:
别的没办法了吧。

可以自行处理

这个只能从业务上处理

业务处理吧

版本升级到7.5.2以后,用AUTO_ID_CACHE=1就不会有号段问题了,统一递增

插入另一个的值是什么意思?如何看到另一个的值lz