通过 JDBC 执行 INSERT IGNORE 时获取重复计数

Posted

技术标签:

【中文标题】通过 JDBC 执行 INSERT IGNORE 时获取重复计数【英文标题】:Getting duplicate count when executing INSERT IGNORE via JDBC 【发布时间】:2012-04-13 12:50:47 【问题描述】:

通过 JDBC 执行 mysql "INSERT IGNORE" 语句时是否可以获得重复计数?

例如,当我在 mysql 命令行上执行 INSERT IGNORE 语句时,有重复我得到类似

查询正常,0 行受影响(0.02 秒) 记录:1 重复:1 警告:0

注意它在哪里说“重复:1”,表示有重复被忽略。

通过 JDBC 执行查询时是否可以获得相同的信息?

谢谢。

【问题讨论】:

我不相信重复数据存储在查询中。最接近的方法是在INSERT 之前运行SELECTWHERE unique values,获取行数,然后就是你的重复项。 你找到如何检索重复项的值了吗? 【参考方案1】:

我相信您可以通过在插入后发出 SHOW WARNINGS 来检索它。

http://dev.mysql.com/doc/refman/5.0/en/show-warnings.html

【讨论】:

INSERT IGNORE 在尝试插入重复值时不会产生警告。正如我之前写的 - 如果我从 SQL 控制台运行它 - 它会产生如下内容: Query OK, 0 rows affected (0.02 sec) Records: 1 Duplicates: 1 Warnings: 0 So "Warnings: 0" 表示没有警告.【参考方案2】:

在执行 INSERT IGNORE 时,您可以使用 ROW_COUNT() 和 FOUND_ROWS() 函数来确定插入行数和重复行数。

例如:

SELECT ROW_COUNT(), FOUND_ROWS()
    INTO myRowCount, myFoundRows;
myInsertedRows = myRowCount;
myDuplicateRows =  myFoundRows - myInsertedRows;
COMMIT;

【讨论】:

您的示例中的“INSERT IGNORE”在哪里?【参考方案3】:

您可以通过 JDBC 获取 rows affected 值。只需从您插入的行数中减去它即可。

请记住,rows affected 还包括受查询间接影响的行。因此,如果有任何触发器影响其他行,rows affected 也会包含这些行。

见:http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#executeUpdate()

【讨论】:

以上是关于通过 JDBC 执行 INSERT IGNORE 时获取重复计数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增

jdbc批量执行SQL insert 操作

java关于jdbc的insert语句问题?

MYSQL 之 JDBC: 增删改查通过Statement执行更新操作

INSERT IGNORE 与 INSERT INTO的区别

INSERT IGNORE 与INSERT INTO的区别