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

时间:2015-01-06 07:14:13

标签: java mysql jdbc insert-update

我对MySQL INSERT ... ON DUPLICATE KEY UPDATE声明的返回值感到困惑。当我在MySQL客户端(mysql终端,phpmyadmin或MySQL Workbench)上尝试时,执行结果如下:

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

这些结果很有意义。但是,当我在Java中执行相同的查询(使用mysql-connector 5.1.34)时,JDBC的executeUpdate方法返回 1 插入和不更改,以及 2 ,以便更新成功。当更新无效时,它不会返回0。

这是MySQL JDBC驱动程序的错误吗?如果是这样,是否有一个没有这个bug的版本?如果这不是错误,我如何获得MySQL客户端返回的相同结果?

1 个答案:

答案 0 :(得分:5)

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

我在谷歌搜索后得到了解决方案。您可以参考此INSERT ON DUPLICATE KEY UPDATE return 0 if no change in JDBC ExecuteUpdate

的MySql Bug

同样在讨论中声明他们在5.1.7中发布了

编辑你的第二个问题:

<强> useAffectedRows

连接到服务器时不要设置CLIENT_FOUND_ROWS标志(不符合JDBC标准,会破坏大多数依赖于“找到”行和DML语句“受影响行”的应用程序),但会导致“正确”更新从服务器返回的“INSERT ... ON DUPLICATE KEY UPDATE”语句计算。

默认值:false

自版本:5.1.7

尊重useAffectedRows in JDBC Connector-j