这个问题在这里已经有答案了:
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))
1条答案
按热度按时间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属性。