【发布时间】:2013-11-11 06:45:55
【问题描述】:
我正在使用 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();
}
});
感谢您的宝贵回答。谢谢
【问题讨论】:
-
如果是自增键,为什么不能在插入语句中不使用该字段?
-
我需要在我的代码中有 id 值,因为我说过我需要有 id 值来更新数据,所以不能使用用户自动增量功能
-
LAST_INSERT_ID()顾名思义,返回最后插入记录的ID(如果有)。您实际上是在插入后立即从数据库中读回的。这不能用于插入新记录,因为密钥已经存在于数据库中。一种选择是在您的代码中增加它,但我强烈不同意在代码中增加 id,因为它会导致很多问题。 -
@bansi,我同意你的观点,自动增量是最安全的方法,但我需要将生成的密钥取回我的代码,我已经搜索了很多 jdbctemplate 批量插入,但它不支持
标签: mysql spring spring-jdbc