У меня возникли проблемы с использованием mySQL и Spring JDBCTemplate. У меня есть INSERT... ON DUPLICATE KEY UPDATE, который увеличивает счетчик, но использует трюк LAST_INSERT_ID() для возврата нового значения в том же запросе через последний сгенерированный идентификатор. Я использую JDCTemplate.update() с PreparedStatementCreator и GeneratedKeyHolder, но получаю несколько записей в KeyHolder.getKeyList(). Когда я запускаю его вручную в клиенте mySQL, у меня затрагиваются 2 строки (когда он попадает в DUPLICATE KEY UPDATE), а затем SELECT LAST_INSERT_ID();
дает мне правильное значение.
ОБНОВЛЕНИЕ: похоже, что все 3 записи в keyList имеют по 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();