通过 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
之前运行SELECT
和WHERE 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自增
MYSQL 之 JDBC: 增删改查通过Statement执行更新操作