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 返回啥?的主要内容,如果未能解决你的问题,请参考以下文章
executeUpdate() 抛出 MySQLSyntaxErrorException
Java Hive 连接 executeUpdate() 始终返回计数为零
PreparedStatement.executeUpdate() 不影响数据库
java - 如何从java中的executeUpdate OR update中获取值?
json代码驾照考题批量加入MySQL数据库 ps.executeUpdate()永远只能悲催的加一条数据 去掉id主键自增 for 与 foreach