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:的来源。

    最佳答案

    C api不像 mysql_affected_rows() 那样直接提供数字访问这些值(或用于计算这些值的基础信息)。
    但是,您可以使用 mysql_info() 访问该消息:

    如果您需要详细访问这些值,则可以/必须解析这些(与查询相关的)字符串。 mysql客户端仅按原样显示此消​​息。
    不幸的是,并非每个api(包括MySQL Connector/J)都实现或中继了此功能,因此这些详细值似乎无法在此处访问。

    关于mysql - 获取INSERT ... SELECT ...重复键更新时的 "Records"和 "Duplicates"计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52731928/

    10-11 15:02