H2中的ON DUPLICATE KEY支持

Rla*_*que 6 mysql spring h2 spring-data-jpa

我在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
)
Run Code Online (Sandbox Code Playgroud)

回购:

@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);
Run Code Online (Sandbox Code Playgroud)

最后,我对H2进行了调整,以便使用mySQL模式

my_schema.datasource.jdbcUrl: jdbc:h2:mem:my_schema;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
Run Code Online (Sandbox Code Playgroud)

当我运行一个仅尝试在同一天多次存储值的测试时,它第一次运行,然后抛出异常,表明正在插入重复键:

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
Run Code Online (Sandbox Code Playgroud)

我打赌mySQL支持在H2中不能完全正常运行,但是我错过了什么吗?有什么办法可以使“ ON DUPLICATE KEY”正常工作?

编辑:我看了这篇文章,但我有一个不同的错误。