duplicatekeyexception

nbysray5  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(365)

我正在使用jooq对auroramysql执行crud操作。
我有以下场景:
如果由于重复密钥异常导致插入失败,请再次重试相同的操作,否则忽略该异常。
如果插入失败,则在满足条件时更新记录。
有 有什么方法只捕获重复的keyexception吗?jooq正在将异常作为dataaccessexception抛出。
在启用onduplicatekeyupdate时,如果记录存在,它似乎会盲目地更新数据库中的记录。我的用例是,如果数据库中存在记录,那么在满足更新条件的情况下更新记录。
我可以在两个单独的insert和update调用中完成,但是有没有方法不能在一个调用中完成呢?
谢谢!!

watbbzwu

watbbzwu1#

你的问题有两个问题:
有没有办法只捕获重复的keyexception?jooq正在将异常作为dataaccessexception抛出。
当然可以。jooq没有针对个别错误(如jdbc)的单独异常类型,但它仍然:
引用jdbc SQLException 导致了 DataAccessException . 你可以通过 dae.getCause() 或者 dae.getCause(SQLException.class) ,后者在原始的情况下是有用的 SQLException 已经包了好几次了。
引用 DataAccessException.sqlStateClass() . 你要找的是 SQLStateClass.C23_INTEGRITY_CONSTRAINT_VIOLATION . 如果您的jdbc驱动程序在其异常中传播sql state类,那么您可以通过jooq获得这些信息。
在启用onduplicatekeyupdate时,如果记录存在,它似乎会盲目地更新数据库中的记录。我的用例是,如果数据库中存在记录,那么在满足更新条件的情况下更新记录。
您可以在 ON DUPLICATE KEY UPDATESET 条款:

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

在上面的例子中 UPDATE 子句将更新 value3 如果是的话 2 .

相关问题