Java MySQL executeUpdate() 为重复键更新上的 INSERT ON 返回啥?

Posted

技术标签:

【中文标题】Java MySQL executeUpdate() 为重复键更新上的 INSERT ON 返回啥?【英文标题】:What does the Java MySQL executeUpdate() returns for INSERT ON ON DUPLICATE KEY UPDATE?Java MySQL executeUpdate() 为重复键更新上的 INSERT ON 返回什么? 【发布时间】:2015-06-24 12:07:22 【问题描述】:

我在网上查了大约 3 个小时,仍然找不到这个问题的答案。

java documentation 和这个tutorial 说:

返回:(1) SQL 数据操作语言的行数 (DML) 语句或 (2) 0 用于不返回任何内容的 SQL 语句

所以它的意思是:

插入没有重复的 1 行 -> 1 插入不重复的 3 行 -> 3 插入 3 行,所有重复项且没有更新值 -> 0 插入 3 行,其中 2 个无重复项和 1 个重复项,更新一个值 -> 3 插入 3 行,其中 2 个不重复和 1 个重复不更新值 -> 2

或者至少这是我从文档中了解到的。

但是,阅读 *** 上的其他问题 here 和 here 让我再次感到困惑,因为它没有描述这种行为,而是描述了 mysql documentation 所说的内容

如果使用 ON DUPLICATE KEY UPDATE,每行的受影响行值为 1,如果 该行作为新行插入,如果现有行被更新,则为 2,并且 如果将现有行设置为其当前值,则为 0。

如果前一种行为是 Java 独有的使用连接器,而后一种行为是通过直接 MySQL 操作,这仍然有意义,但正如我之前所说,我发现答案说它使用第一个或第二个相互矛盾的.

这对我来说很重要,因为在我的代码中,我在更新许多条目时执行插入操作,并通过比较返回数和我的数组来检查它是否成功执行以修改计数。

【问题讨论】:

编写代码来测试一下,你会得到答案。 compensateOnDuplicateKeyUpdateCounts 描述的配置属性 here 也可能会影响您看到的结果。 【参考方案1】:

MySQL Reference Manual 说:

使用 ON DUPLICATE KEY UPDATE 时,如果将行作为新行插入,则每行的受影响行值为 1,如果更新现有行,则值为 2。

【讨论】:

这正是我在我的问题中写的。 Java 驱动程序说“SQL 数据操作语言 (DML) 语句的行数”,这意味着如果更新现有行,我将得到 1 而不是 2。 它并不“暗示”任何这样的事情。它明确声明如果现有行被更新,您会得到“2”。 我指的是 Java 驱动程序的文档,其中说明了行数。你说的是 MySQL 文档,它们是不同的东西。

以上是关于Java MySQL executeUpdate() 为重复键更新上的 INSERT ON 返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

java 调用mysql的事务如何传入查询参数?

executeUpdate() 抛出 MySQLSyntaxErrorException

Java Hive 连接 executeUpdate() 始终返回计数为零

PreparedStatement.executeUpdate() 不影响数据库

java - 如何从java中的executeUpdate OR update中获取值?

json代码驾照考题批量加入MySQL数据库 ps.executeUpdate()永远只能悲催的加一条数据 去掉id主键自增 for 与 foreach