代码之家  ›  专栏  ›  技术社区  ›  AlikElzin-kilaka planben

MySQL Java驱动程序在执行重复密钥更新V=V [复制]时返回1

  •  0
  • AlikElzin-kilaka planben  · 技术社区  · 8 年前

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

    命令: 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))

    1 回复  |  直到 8 年前
        1
  •  0
  •   Andreas dfa    8 年前

    参见例如 mysql_affected_rows() :

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

    见JDBC connection property useAffectedRows :

    使用受影响的对象

    在连接到服务器时,不要设置客户机的“找到的行”标志(不符合JDBC,会破坏大多数依赖于“找到的”行和DML语句的“受影响的行”的应用程序),但会导致“插入”中的“正确”更新计数。在服务器返回的“重复键更新”语句上。

    默认值:假

    自版本:5.1.7

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