首页 > 解决方案 > JooQ 中的 DuplicateKeyException

问题描述

我正在使用 JooQ 在 Aurora MySQL 上执行 CRUD 操作。

我有以下情况:

  1. 如果由于重复键异常而导致插入失败,则再次重试相同的操作,否则忽略该异常。
  2. 如果插入失败,则在满足条件时更新记录。

有没有办法只捕获 DuplicateKeyException ?JooQ 将异常作为 DataAccessException 抛出。

在启用 OnDuplicateKeyUpdate 时,似乎如果记录存在,它将盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,则在满足更新条件时更新记录。

我可以在插入和更新的两个单独调用中做到这一点,但是有没有办法在一次调用中做到这一点?

谢谢!!

标签: javamysqlsqljooqamazon-aurora

解决方案


你的问题有两个问题:

有没有办法只捕获 DuplicateKeyException ?JooQ 将异常作为 DataAccessException 抛出。

是的当然。jOOQ 没有针对 JDBC 等单个错误的单独异常类型,但它仍然:

在启用 OnDuplicateKeyUpdate 时,似乎如果记录存在,它将盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,则在满足更新条件时更新记录。

您可以在ON DUPLICATE KEY UPDATE'SET子句中对更新条件进行编码:

INSERT INTO t (id, value)
VALUES (1, 2)
ON DUPLICATE KEY UPDATE SET
  value = CASE WHEN value = 2 THEN 3 ELSE value END

在上面的例子中,UPDATE子句只有在它是value时才会更新。32


推荐阅读