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:
的来源。
答案 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
)都实现或中继了此功能,因此这些详细值似乎无法在此处访问。