我在使用 mySQL 和 Spring JDBCTemplate 时遇到了一些问题。我有一个 INSERT ... ON DUPLICATE KEY UPDATE 增加一个计数器,但使用 LAST_INSERT_ID() 技巧通过最后生成的 id 在同一查询中返回新值。我将 JDCTemplate.update() 与 PreparedStatementCreator 和 GeneratedKeyHolder 一起使用,但我在 KeyHolder.getKeyList() 中获得了多个条目。当我在 mySQL 客户端中手动运行它时,有 2 行受到影响(当它点击 DUPLICATE KEY UPDATE 时),然后它SELECT LAST_INSERT_ID();
给了我正确的值。
更新:看起来 keyList 中的 3 个条目每个都有 1 个条目,它们都是递增值。所以keyList.get(0).get(0)有应该返回的值,然后keyList.get(0).get(1)就是之前的值+1,然后keyList.get(0).get (2) 是前一个值+1。例如,如果 4 是应该返回的值,它会按该顺序给我 4、5、6。
相关代码为:
CREATE TABLE IF NOT EXISTS `ClickChargeCheck` (
uuid VARCHAR(50),
count INTEGER Default '0',
CreatedOn Timestamp DEFAULT '0000-00-00 00:00:00',
UpdatedOn Timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
String CLICK_CHARGE_CHECK_QUERY = "INSERT INTO ClickChargeCheck (uuid,count,CreatedOn) VALUES(?,LAST_INSERT_ID(1),NOW()) ON DUPLICATE KEY UPDATE count = LAST_INSERT_ID(count+1)";
...
...
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
centralStatsJdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(CLICK_CHARGE_CHECK_QUERY, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, uuid);
return ps;
}}, keyHolder);
int count = keyHolder.getKey().intValue();