mysql java驱动程序在执行重复密钥更新v=v时返回1

6vl6ewon  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(193)

这个问题在这里已经有答案了

java上的mysql“insert…on duplicate key update”:如何区分insert/updated/nochange状态(1个答案)
jdbc返回1表示executebatch()[duplicate]中的记录没有更新(1个应答)
两年前关门了。
我正在执行相同的sql命令 ON DUPLICATE KEY UPDATE v=v 两种方式。
命令: INSERT INTO VS (v) VALUES ('someValue') ON DUPLICATE KEY UPDATE v=v; 两种方式产生不同的结果:
当使用本机mysql客户端并满足约束时,受影响的行数为0。信息: Query OK, 0 rows affected (0.14 sec) 使用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 driver 1中,在那里什么都不应该更新?谢谢。
为清楚起见,表创建如下所示: CREATE TABLE IF NOT EXISTS VS (v VARCHAR(128) NOT NULL, PRIMARY KEY (v))

vxqlmq5t

vxqlmq5t1#

参见示例。 mysql_affected_rows() :
为了 INSERT ... ON DUPLICATE KEY UPDATE 语句中,如果将行作为新行插入,则每行受影响的行值为1;如果更新现有行,则每行受影响的行值为2;如果将现有行设置为其当前值,则每行受影响的行值为0。如果您指定 CLIENT_FOUND_ROWS 如果现有行设置为其当前值,则受影响的行值为1(而不是0)。
请参见jdbc连接属性 useAffectedRows :
使用受影响的箭头
连接到服务器时不要设置client\u found\u rows标志(不符合jdbc,将破坏大多数依赖于“found”行和“affected rows”的dml语句的应用程序),但会导致“insert…”中的“correct”更新计数。。。服务器返回的“复制密钥更新”语句。
默认值:false
自版本:5.1.7起
因此,如果希望update counts的非标准行为仅对受影响的行进行计数,而不是对找到的行进行标准计数,则需要指定connetion属性。

相关问题