【问题标题】:DuplicateKeyException in JooQJooQ 中的 DuplicateKeyException
【发布时间】:2019-04-30 06:54:54
【问题描述】:

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

我有以下场景:

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

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

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

我可以在插入和更新的两个单独调用中做到这一点,但有什么方法可以在一个调用中做到这一点?

谢谢!!

【问题讨论】:

    标签: java mysql sql jooq amazon-aurora


    【解决方案1】:

    你的问题有两个问题:

    有什么方法可以只捕获 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 子句只有在2 时才会将value 更新为3。

    【讨论】:

    • 值得指出的是,这个 SQL State 类也用于插入时的非空约束。如果集成测试没有抓住它,我会咬我的。
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2018-02-22
    • 2013-05-04
    • 1970-01-01
    • 2018-03-09
    • 2017-02-05
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多