我在Spring Boot(& spring data JPA)应用程序中使用h2进行测试。
我每天都存储某种统计信息,因此我设置了ON DUPLICATE KEY UPDATE查询来存储这些统计信息。如果在给定的一天内没有存储任何内容,请创建一个新条目。如果这一天已经在数据库中,只需增加其值即可。
架构:
CREATE TABLE statistic (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
my_date DATE UNIQUE,
value_1 INTEGER DEFAULT 0,
value_2 INTEGER DEFAULT 0,
value_3 INTEGER DEFAULT 0,
...
value_X INTEGER DEFAULT 0
)
回购:
@Modifying
@Query(value = "INSERT INTO statistic (value_X, my_date) SELECT :valueX,, :myDate " +
"ON DUPLICATE KEY UPDATE value_X, = value_X, + :valueX,", nativeQuery = true)
void saveOrIncrementValueX(@Param("valueX") Integer valueX, @Param("myDate") LocalDate myDate);
最后我调整了H2,因此使用了mySQL模式
my_schema.datasource.jdbcUrl: jdbc:h2:mem:my_schema;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
当我运行一个只是尝试在同一天多次存储值的测试时,它第一次工作,然后抛出一个异常,说明正在插入一个重复的键:
o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23505, SQLState: 23505
o.h.engine.jdbc.spi.SqlExceptionHelper : Unique index or primary key violation: "UK_SQNR5X4KWWB6W0IXLL4HURKTF_INDEX_2 ON PUBLIC.STATISTIC(MATCH_DATE) VALUES (DATE '2018-03-06', 1)"; SQL statement:
INSERT INTO statistic (version_ok, match_date) SELECT ?, ? ON DUPLICATE KEY UPDATE version_ok = version_ok + ? [23505-185]
o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task.
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["UK_SQNR5X4KWWB6W0IXLL4HURKTF_INDEX_2 ON PUBLIC.STATISTIC(MATCH_DATE) VALUES (DATE '2018-03-06', 1)"; SQL statement:
INSERT INTO statistic (version_ok, match_date) SELECT ?, ? ON DUPLICATE KEY UPDATE version_ok = version_ok + ? [23505-185]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
我敢打赌我的SQL支持在H2中没有完全正常运行,但是我错过了什么吗?我能做些什么来使“ON DUPLICATE KEY”正常工作吗?
编辑:我看了this post,但我有一个不同的错误。