Py学习  »  DATABASE

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

AlikElzin-kilaka • 4 年前 • 696 次点击  

我正在执行相同的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))

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38068
 
696 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Andreas
Reply   •   1 楼
Andreas    5 年前

参见例如 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

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