获取INSERT ... SELECT ...重复键更新时的“记录”和“重复”计数

时间:2018-10-10 02:54:56

标签: mysql

INSERT ... SELECT ... ON DUPLICATE KEY UPDATE返回一个受(inserted count) + (updated count) * 2派生的数字,作为受影响行,这是well documented中的multiple places

但是在MySQL Command-Line Tool的输出中,我注意到了以下额外信息:

> INSERT INTO ...
-> SELECT ... FROM ...
-> ON DUPLICATE KEY UPDATE ...
-> ;
Query OK, 97 rows affected (0.03 sec)
Records: 2425  Duplicates: 28  Warnings: 0

即数字Records:Duplicates:

分析已确定:

  • 97 rows affected受影响的行(又称ROW_COUNT())。
  • Records: 2425SELECT部分获取的行数。
  • Duplicates: 28ON DUPLICATE KEY UPDATE部分实际更改的行数。

因此:

  • affected-rows - Duplicates * 2是实际插入的行数。
  • Records - affected-rows - Duplicates是重复但未更改的行数(即,将值设置为相同的值)。

这带来了一个问题:一个人如何在程序中获取这些数字RecordsDuplicates(如果有帮助,我正在使用MySQL Connector / J回答问题。)

可能是Records:的一种方式。在SELECT之后直接在FOUND_ROWS()上发布INSERT ... SELECT ... ON DUPLICATE KEY UPDATE

我不知道Duplicates:的来源。

1 个答案:

答案 0 :(得分:2)

mysql_affected_rows()一样,C api也不提供对这些值(或用于计算这些值的基础信息)的直接访问。

但是您可以使用mysql_info()访问该消息:

  

mysql_info()

     

const char *mysql_info(MYSQL *mysql)

     

说明

     

检索一个字符串,该字符串提供有关最近执行的语句的信息,但仅适用于此处列出的语句。对于其他语句,mysql_info()返回NULL。字符串的格式取决于语句的类型,如此处所述。这些数字仅是说明性的。该字符串包含适合该语句的值。

     
      
  • INSERT INTO ... SELECT ...

         

    字符串格式:Records: 100 Duplicates: 0 Warnings: 0

  •   
  • [...]

  •   
  • UPDATE

         

    字符串格式:Rows matched: 40 Changed: 40 Warnings: 0

  •   
     

返回值

     

一个字符串,表示有关最近执行的语句的附加信息。如果该语句无可用信息,则为NULL。

如果需要详细访问这些值,则可以/必须解析这些(与查询相关的)字符串。 mysql客户端仅按原样显示此消​​息。

不幸的是,并非每个api(包括MySQL Connector/J)都实现或中继了此功能,因此这些详细值似乎无法在此处访问。