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

Posted

技术标签:

【中文标题】MySQL重复键更新+受影响的行数【英文标题】:MySQL on duplicate key update + affected row count 【发布时间】:2014-06-02 15:15:35 【问题描述】:

使用以下 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)?

(另请注意,在此特定实例中,“Insert Ignore”和“Replace Into”查询均不适合替换“Insert on Duplicate Key Update”查询。)

【问题讨论】:

【参考方案1】:

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

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;

【讨论】:

以上是关于MySQL重复键更新+受影响的行数的主要内容,如果未能解决你的问题,请参考以下文章

如何获取受 SQL Alchemy 影响的行数?

在 SQLite-WinRT 包装器中使用“更新”或“删除”查询获取受影响的行数

MySQL 时间戳记录正在更新,但受影响的行仍然为 0

用于插入/更新 MySql DB 的函数返回错误的“受影响的行”数

关于mybatis更新数据的问题

MySQL 巨坑:update 更新慎用影响行数做判断!!!