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即,数字Records:和Duplicates:。
分析确定:
97 rows affected受影响-行(a.k.a )。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:来说,在FOUND_ROWS()上直接在INSERT ... SELECT ... ON DUPLICATE KEY UPDATE之后发布一个INSERT ... SELECT ... ON DUPLICATE KEY UPDATE是一种方法。
我不知道Duplicates:从何而来。
发布于 2018-10-10 07:20:42
C不像对mysql_affected_rows()那样,以数字的形式直接访问这些值(或计算这些值的底层信息)。
但是,您可以使用mysql_info()访问该消息。
mysql_info()
const char *mysql_info(MYSQL *mysql)描述 检索一个字符串,该字符串提供有关最近执行的语句的信息,但仅用于此处列出的语句。对于其他语句,mysql_info()返回NULL。字符串的格式取决于语句的类型,如下所述。数字只是说明性的;字符串包含适合于语句的值。
INSERT INTO ... SELECT ...
字符串格式:Records: 100 Duplicates: 0 Warnings: 0UPDATE
字符串格式:Rows matched: 40 Changed: 40 Warnings: 0返回值
一个字符串,表示有关最近执行的语句的其他信息。如果该语句没有可用的信息,则为空。
如果需要详细访问这些值,可以/必须解析这些(查询依赖的)字符串。mysql客户端只显示这条消息。
不幸的是,并不是每个api (包括MySQL Connector/J )都实现或中继这个特性,因此这些详细的值在这里似乎无法访问。
https://stackoverflow.com/questions/52731928
复制相似问题