MySql java驱动程序在执行重复密钥更新v=v时返回1
我正在以两种方式执行相同的sql命令,即对重复键更新v=v执行MySql java驱动程序在执行重复密钥更新v=v时返回1,java,mysql,jdbc,on-duplicate-key,Java,Mysql,Jdbc,On Duplicate Key,我正在以两种方式执行相同的sql命令,即对重复键更新v=v执行 命令:在重复键更新v=v时插入VS(v)值('someValue') 两种方式产生不同的结果: 当使用本机mysql客户端并满足约束时,受影响的行数为0。消息:查询正常,0行受影响(0.14秒) 当使用mysql jdbc驱动程序(mysql-connector-java-8.0.11.jar)并使用int res=ps.executeUpdate(…))执行相同的命令时,结果是1 从java文档中,结果是SQL数据操作语言(DML
命令:在重复键更新v=v时插入VS(v)值('someValue')代码>
两种方式产生不同的结果:
当使用本机mysql客户端并满足约束时,受影响的行数为0。消息:查询正常,0行受影响(0.14秒)
当使用mysql jdbc驱动程序(mysql-connector-java-8.0.11.jar
)并使用int res=ps.executeUpdate(…)
)执行相同的命令时,结果是1
从java文档中,结果是SQL数据操作语言(DML)语句的行数,但没有进行更新或插入
另外,在执行之后调用ps.getUpdateCount()
,也会返回1
为什么会出现mysql java驱动程序1,其中没有任何内容需要更新?谢谢
为了清楚起见,表格创建如下所示:
如果不存在,则创建表VS(v VARCHAR(128)NOT NULL,主键(v))
参见示例:
对于插入。。。在重复键更新
语句中,如果将行作为新行插入,则每行受影响的行值为1;如果更新现有行,则每行受影响的行值为2;如果将现有行设置为其当前值,则每行受影响的行值为0如果指定客户端\u FOUND\u ROWS
标志,则如果将现有行设置为其当前值,则受影响的行值为1(而不是0)。
请参见JDBCuseAffectedRows
:
useAffectedRows
在连接到服务器时不要设置CLIENT_FOUND_ROWS标志(不符合JDBC,将破坏大多数依赖于DML语句的“FOUND”行与“infected ROWS”的应用程序),但会导致服务器返回“INSERT…on DUPLICATE KEY update”语句中的“correct”更新计数
默认值:false
自版本:5.1.7起
因此,如果希望更新计数的非标准行为仅对受影响的行计数,而不是对找到的行的标准计数,则需要指定connetion属性。什么是“未进行更新”?将列更新为其已具有的相同值仍然是一个更新。@andreas-在本机客户端上对重复键更新v=v运行时,结果消息为Query OK,0行受影响(0.14秒)
,表示未执行更新,这是合乎逻辑的:将列更新为已经存在的相同值没有任何意义。