我在使用mySQL和Spring JDBCTemplate時遇到了一些麻煩。我有一個INSERT ... ON DUPLICATE KEY UPDATE,它增加了一個計數器,但是使用LAST_INSERT_ID()技巧通過最後生成的ID返回同一個查詢中的新值。我正在使用PreparedStatementCreator和GeneratedKeyHolder的JDCTemplate.update(),但我在KeyHolder.getKeyList()中獲取了多個條目。當我在mySQL客戶端手動運行它時,我得到2行受到影響(當它遇到DUPLICATE KEY UPDATE時),然後SELECT LAST_INSERT_ID();
給我正確的值。由LAST_INSERT_ID()設置的JDBCTemplate檢索值問題mySQL trick
更新:它看起來像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();