jdbc返回1表示没有更新到executeBatch()中的记录

时间:2018-01-24 06:08:11

标签: java mysql jdbc

我有像这样的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));

1 个答案:

答案 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.