获取"记录"和"重复"计数INSERT ... SELECT ... ON DUPLICATE KEY UPDATE

ant*_*tak 5 mysql

该收益为受影响的行多项源自,这是有据可查的多个地方.INSERT ... SELECT... ON DUPLICATE KEY UPDATE(inserted count) + (updated count) * 2

但是在MySQL命令行工具的输出中,我注意到了这个额外的信息:

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

即,数字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:在发出SELECTFOUND_ROWS()后直接INSERT ... SELECT ... ON DUPLICATE KEY UPDATE是单向的.

我不知道Duplicates:从哪里来.

Sol*_*are 2

C api 不像mysql_affected_rows().

但是,您可以使用以下方式访问该消息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、 )都实现或中继此功能,因此这些详细值似乎无法在此处访问。