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。)可能是
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/