我使用spring jdbctemplate将行插入mysql数据库,我在批量插入mysql数据库时遇到问题。问题是,当插入第二行时,我的主键上出现重复键冲突。我已将USER_KEY置于批量更新方法中,但我在插入第二行时遇到异常Duplicate entry '1' for key 'PRIMARY'
。
我的方法没有注释@Transactional
。
注意: - 我需要通过代码生成主键并将其用于更新/删除操作,因此不依赖于auto_increment。另外,jdbctemplate批量插入不会返回生成的密钥。
这是我的代码
private static final String USER_KEY = "SELECT LAST_INSERT_ID() FROM USER";
jd.batchUpdate(INSERT_QUERY,
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int count)
throws SQLException {
Long userId= jd.queryForObject(
USER_KEY, Long.class);
UserDO Userdo = userlst
.get(count);
ps.setLong(1, userId+1);
ps.setString(2, Userdo .getFirstName());
ps.setString(3, Userdo .getLastName());
ps.setString(4, Userdo .getMobile());
ps.setString(5, Userdo .getEmail());
ps.setInt(6, 0);
}
@Override
public int getBatchSize() {
return UserdoLst.size();
}
});
感谢您的宝贵答案。感谢
答案 0 :(得分:0)
你在哪里增加了用户密钥? 你得到最后一个插入的id并使用相同的。或者它被LAT_INSERT_ID()所取代? Shoudnt是ps.setLong(1,userId + 1)?
解决我之前使用过的主要问题的一种方法:
例如 对于表MyTable1初始键值为0 当你调用proc getPrimaryKey(MyTable1)时,它会返回1并更新主键表。
现在,在进行批量更新之前,您可以从此proc获取密钥并在查询中设置它们。
希望这有帮助