我有像这样的mysql查询
INSERT INTO table (col1, col2, col3) VALUES ('val1','val2','val3') ON DUPLICATE KEY UPDATE col1=VALUES(col1),STATUS=1
我在JDBC中使用executeBatch()
来插入多条记录,如果记录已经存在,则更新状态列和其他一些值。表格也有last_updated
列。
对于新记录插入jdbc返回1和2进行更新,但它返回1表示没有更新记录。如果我手动执行具有相同值的查询,则会影响0行。
String usersToConvquery = "INSERT INTO ne_ms_conversation_users (conversationId, userId, role) VALUES (?,?,?) ON DUPLICATE KEY UPDATE role=VALUES(role),STATUS=1";
stm = connection.prepareStatement(usersToConvquery);
for (long userId : users) {
stm.setString(1, conversationId);
stm.setLong(2, userId);
stm.setInt(3, 3);
stm.addBatch();
}
int[] insertCount = stm.executeBatch();
System.out.println(Arrays.toString(insertCount));
答案 0 :(得分:3)
默认情况下,MySQL Connector / J驱动程序返回'找到的数字'已插入或更新的行,即使没有更改任何值,请参阅useAffectedRows
(默认为false)连接属性文档:
连接服务器时,请勿设置CLIENT_FOUND_ROWS标志 (不符合JDBC标准,将打破大多数依赖"发现" 行与#34;受影响的行"对于DML语句),但确实导致"纠正" 更新计数来自" INSERT ... ON DUPLICATE KEY UPDATE"声明 由服务器返回。
有趣的是,JDBC规范没有提到返回计数的确切含义(尽管可以由TCK检查),但是对于某些数据库系统和受影响的行来说确实如此。 =='找到行',因为无论旧值如何都会更新(如果只是为了获得正确的事务行为),并且很多应用程序依赖于updateCount > 0
含义也是如此该行已存在。
INSERT ... ON DUPLICATE KEY UPDATE
上的MySQL文档说:
使用
ON DUPLICATE KEY UPDATE
,每行的受影响行值为1 如果行作为新行插入,如果更新现有行,则为2 如果现有行设置为其当前值,则为0。如果你指定CLIENT_FOUND_ROWS
C API的mysql_real_connect()
标记 连接到mysqld
时的功能,受影响的行值为1 (不是0)如果现有行设置为其当前值。
您可能还想查看connection property compensateOnDuplicateKeyUpdateCounts
,这将使这样的语句的所有执行都返回更新计数1.