【问题标题】: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

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

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

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

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

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

【问题讨论】:

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

标签: java mysql jdbc


【解决方案1】:

MySQL Reference Manual 说:

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

【讨论】:

  • 这正是我在我的问题中写的。 Java 驱动程序说“SQL 数据操作语言 (DML) 语句的行数”,这意味着如果更新现有行,我将得到 1 而不是 2。
  • 它并不“暗示”任何这样的事情。它明确声明如果现有行被更新,您会得到“2”。
  • 我指的是 Java 驱动程序的文档,其中说明了行数。你说的是 MySQL 文档,它们是不同的东西。
猜你喜欢
  • 2012-11-16
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多