JDBC返回错误数量的受影响的行

rez*_*ess 3 mysql jdbc

如果我们有一个包含10行的表,并且我们执行此查询两次,则第二次得到错误的受影响行数.

Statement st = open();

st.executeUpdate("UPDATE  `tickets` SET price=1000"); // return 10
st.executeUpdate("UPDATE  `tickets` SET price=1000"); // return 10
Run Code Online (Sandbox Code Playgroud)

显然这是不正确的,因为在第一个查询中,所有行的价格都更新为1000,而在第二个查询中没有任何实际更改,但它再次返回10!

如何获取实际更新的行数?

Gor*_*son 6

JDBC规范显然要求驱动程序executeUpdate()返回UPDATE语句找到的行数,而不是实际影响的行数.

要让MySQL Connector/J返回实际更改的行数,您可以将属性添加useAffectedRows=true到连接URL,尽管文档确实警告它是

不符合JDBC标准,将破坏大多数依赖于"找到"行和DML语句"受影响行"的应用程序

  • JDBC规范(4.2,第13.1.2.2节)说_"正在执行的SQL语句返回受SQL数据操作语言(DML)语句更新影响的行数"_.但是,对于每个数据库,受影响的行数可能不同(无论如何,它可能会更新,即使值相同;触发器更改的行可能包含也可能不包括,等等). (2认同)