该收益为受影响的行多项源自,这是有据可查的在多个地方.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: 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_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、 )都实现或中继此功能,因此这些详细值似乎无法在此处访问。