【 TiDB 使用环境】生产环境 /测试/ Poc
生产环境
【 TiDB 版本】
V6.1.5
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
在批量insert场景下,使用mybatis的useGeneratedKeys取到的主键ID值不准确,主键ID使用的AUTO_RANDOM类型的不准。取到的值与实际插入的值不一致。
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
印象之前看过问题分析,是一个兼容性问题
文章链接还记得不?
在使用 TiDB 数据库时,如果您在批量插入数据时使用了 useGeneratedKeys
,可能会出现主键 ID 值不准确的情况。这是因为 TiDB 的 AUTO_RANDOM
类型的主键是在 TiDB Server 端生成的,而不是在客户端生成的。因此,如果您在客户端使用 useGeneratedKeys
,可能会出现主键 ID 值不准确的情况。
为了解决这个问题,您可以尝试以下两种方法:
-
使用
LAST_INSERT_ID()
函数获取主键 ID 值。在使用INSERT
语句插入数据时,可以在 SQL 语句中使用LAST_INSERT_ID()
函数来获取插入数据的主键 ID 值。例如:@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})") @Options(useGeneratedKeys = true, keyProperty = "id") int insertUser(User user); // 获取插入数据的主键 ID 值 Long id = jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class);
在这个例子中,
useGeneratedKeys
参数设置为true
,表示使用自动生成的主键 ID 值。keyProperty
参数设置为id
,表示将自动生成的主键 ID 值设置到User
对象的id
属性中。在插入数据后,可以使用LAST_INSERT_ID()
函数获取插入数据的主键 ID 值。 -
使用
REPLACE INTO
语句插入数据。在使用REPLACE INTO
语句插入数据时,TiDB 会自动生成主键 ID 值,并将其返回给客户端。例如:@Insert("REPLACE INTO users(id, name, age) VALUES(#{id}, #{name}, #{age})") int insertUser(User user); // 获取自动生成的主键 ID 值 Long id = user.getId();
在这个例子中,使用
REPLACE INTO
语句插入数据,TiDB 会自动生成主键 ID 值,并将其返回给客户端。在插入数据后,可以直接从User
对象中获取自动生成的主键 ID 值。
希望以上建议能够帮助您解决问题。如果您需要更多帮助,请提供更多详细信息,我会尽力为您提供帮助。
1 个赞
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。