一尘不染

MySQL在Java上的“ INSERT…ON DUPLICATE KEY UPDATE”:如何区分插入/更新/ NoChange状态

mysql

我对MySQL的INSERT … ON DUPLICATE KEY
UPDATE
语句的返回值感到困惑。当我在MySQL客户端(mysql终端,phpmyadmin或MySQL
Workbench)上尝试使用它时,执行结果将显示以下内容之一:

  • 1 :如果插入了新记录(即没有重复的密钥)。
  • 2 :如果存在重复记录,则更新现有记录。
  • 0 :如果执行更新,但没有更改列值。

这些结果是有道理的。但是,当我使用Java(使用mysql-connector
5.1.34)在Java中执行相同的查询时,如果同时插入并且没有更改,则JDBC的executeUpdate方法返回 1
,如果成功更新,则返回 2 。当更新无效时,它不会返回0。

这是MySQL JDBC驱动程序的错误吗?如果是这样,是否有没有此错误的发行版?如果这不是错误,那么如何获得与MySQL客户端返回的结果相同的结果?


阅读 278

收藏
2020-05-17

共1个答案

一尘不染

似乎您需要 useAffectedRows 手动设置驱动程序属性。

经过一番谷歌搜索后,我得到了解决方案。如果JDBC
ExecuteUpdate中没有更改,则
可以将此INSERT ON
DUPLICATE KEY UPDATE返回0的
MySql
Bug引用。

同样在讨论中指出他们在5.1.7中发布了它

编辑第二个问题:

useAffectedRows

连接到服务器时不要设置CLIENT_FOUND_ROWS标志(不兼容JDBC,将破坏大多数依赖“发现”行与“受影响行”的DML语句的应用程序),但确实会导致“”的更新计数“正确”服务器将返回“
INSERT … ON DUPLICATE KEY UPDATE”语句。

默认值:false

由于版本:5.1.7

JDBC Connector-j中的参考useAffectedRows

2020-05-17