MySQL重复密钥更新+受影响的行数

时间:2014-04-18 06:21:19

标签: php mysql

Hi Overflowers(长期潜伏者,第一次问题兼容者),

使用以下mySQL查询:

INSERT INTO table (col_a,col_b,col_c,col_d) VALUES (val_a,val_b...val_x) ON DUPLICATE KEY UPDATE col_d = VALUES(col_d)  

鉴于mySQL报告:

  • 每个插入影响1行
  • 每次更新影响2行
  • 每个副本受影响的行数为0(而info()似乎不正确(?)总是报告0个重复项,无论已跳过多少重复条目)

我唯一的数字是:

  • 我尝试插入/更新的总行数(可以是任何数字,如47,163,282 - 每次都不是一组行数)
  • mySQL
  • 报告的受影响行总数

是否有任何数学(或其他)魔法能够可靠地返回插入的数量,更新和跳过的行(重复)?

对于奖励积分,如果不能正确计算插入次数,更新和重复次数仅给出这两个数字(行数和受影响的行),是否有更好的(性能方面)方式而不是简单地在"插入重复密钥更新"之前和之后查询表中的行数。查询?

请注意我已尝试接受的答案和Getting number of rows inserted for ON DUPLICATE KEY UPDATE multiple insert?

上列出的其他公式

但是这些似乎在基本测试中失败了,例如:
总共10行,2个插入,2个更新,6个重复=总共10行,6个受影响的mysql行 (10 * 2 = 20) - 6 = 14个插入(对于接受的答案)?或者,
6 - 10 = -4次更新(第二个答案中的等式3)?

(另请注意,"插入忽略"以及"替换为"查询是适合的替换查询,以换出"插入重复键更新& #34;在此特定实例中进行查询。)

干杯。

1 个答案:

答案 0 :(得分:2)

如果没有更多信息,我认为这是不可能的 - 仅仅是您要插入的行数和受影响的行数还不够。

mysqli->info会返回一个有用的字符串,该字符串也提供重复计数 - 我们可以从中计算出其余部分。

list($rec, $dupes, $warns) = sscanf($mysqli->info, "Records: %d Duplicates: %d Warnings: %d"); // courtesy of user at big lake dot com - php.net
$inserts = $total_rows_affected - ($dupes * 2);
$updates = ($total_rows_affected - $inserts)/2;     
$skipped = $rec - ($inserts + $updates);     
$total = $rec;