在批量insert场景下,使用mybatis的useGeneratedKeys取到的主键ID值不准确 ,主键ID使用的AUTO_RANDOM类型的不准

【 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 值不准确的情况。

为了解决这个问题,您可以尝试以下两种方法:

  1. 使用 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 值。

  2. 使用 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 天后被自动关闭。不再允许新回复。