代码之家  ›  专栏  ›  技术社区  ›  antak Jason

获取“记录”和“重复”计数插入…选择…在重复密钥更新

  •  5
  • antak Jason  · 技术社区  · 6 年前

    这个 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: 2425 是服务器获取的行数 SELECT
    • Duplicates: 28 实际更改的行数 ON DUPLICATE KEY UPDATE

    因此:

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

    如何获得这些数字 Records Duplicates (我正在使用MySQL Connector/J,如果这有助于回答这个问题的话。)

    可能是为了 记录: ,发布 选择 FOUND_ROWS() 直接在 INSERT ... SELECT ... ON DUPLICATE KEY UPDATE

    我不知道在哪里 来自。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Community Egal    4 年前

    capi不提供作为数字直接访问这些值(或计算这些值的基础信息),就像它对 mysql_affected_rows()

    但是,您可以使用 mysql_info()

    mysql\u info()

    const char *mysql_info(MYSQL *mysql)

    检索一个字符串,该字符串提供有关最近执行的语句的信息,但仅限于此处列出的语句。对于其他语句,mysql\u info()返回NULL。字符串的格式因语句的类型而异,如下所述。这些数字只是说明性的;该字符串包含适合该语句的值。

    • INSERT INTO ... SELECT ...

      Records: 100 Duplicates: 0 Warnings: 0

    • [...]

    • UPDATE

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

    返回值

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

    不幸的是,不是每个api,包括 MySQL Connector/J