【问题标题】:MySql java driver returns 1 when executing ON DUPLICATE KEY UPDATE v=v [duplicate]MySql java驱动程序在执行ON DUPLICATE KEY UPDATE v = v时返回1 [重复]
【发布时间】:2019-02-13 23:09:43
【问题描述】:

我正在以两种方式执行具有 ON DUPLICATE KEY UPDATE v=v 的相同 sql 命令。

命令:INSERT INTO VS (v) VALUES ('someValue') ON DUPLICATE KEY UPDATE v=v;

两种方式给出不同的结果:

  1. 当使用原生 mysql 客户端并满足约束时,受影响的行数为 0。消息:Query OK, 0 rows affected (0.14 sec)
  2. 使用mysql jdbc驱动(mysql-connector-java-8.0.11.jar),使用int res = ps.executeUpdate(...)执行同样的命令,结果为1。

从 java 文档中,结果是 the row count for SQL Data Manipulation Language (DML) statements,但没有更新,也没有进行插入。

另外,调用ps.getUpdateCount(),在执行后也返回1。

为什么 mysql java 驱动程序 1 中的结果是不应该更新的?谢谢。

为了清楚起见,表创建如下所示: CREATE TABLE IF NOT EXISTS VS (v VARCHAR(128) NOT NULL, PRIMARY KEY (v))

【问题讨论】:

  • “没有更新”是什么意思?将列更新为它已有的值,仍然是更新。
  • @andreas - 在本机客户端上运行ON DUPLICATE KEY UPDATE v=v 时,结果消息为Query OK, 0 rows affected (0.14 sec),表示未执行更新,这是合乎逻辑的:将列更新到已经存在的相同值。

标签: java mysql jdbc on-duplicate-key


【解决方案1】:

参见例如mysql_affected_rows():

对于INSERT ... ON DUPLICATE KEY UPDATE 语句,如果将行作为新行插入,则每行的受影响行值为 1,如果更新现有行,则为 2,如果将现有行设置为其当前值,则为 0。 如果您指定 CLIENT_FOUND_ROWS 标志,如果现有行设置为其当前值,则受影响的行值为 1(而不是 0)。

见 JDBC connection property useAffectedRows:

使用AffectedRows

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

默认值:假

自版本:5.1.7

因此,如果您希望更新计数的非标准行为仅计数 affected 行,而不是 found 行的标准计数,则需要指定连接属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2011-06-29
    相关资源
    最近更新 更多