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

标签 php mysql

使用以下 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 中报告的受影响行的总数

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

对于奖励积分回合,如果仅根据这两个数字(行数和受影响的行数)无法正确计算插入、更新和重复的数量,是否有更好的(性能方面)方法简单地查询“Insert on Duplicate Key Update”查询前后表中的行数?

请注意,我已尝试接受的答案和列出的其他方程式: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”查询。)

最佳答案

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

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;

关于php - MySQL 重复键更新 + 受影响的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23148574/

相关文章:

mysql - SQLZoo高级查询

php - 表单未提交至 MySQL 数据库

mysql - aurora mysql从s3加载指定文件扩展名

MySQL分组连续出现

php - 通过正则表达式删除 block 注释

php - Cakephp 1.3\persistent\不可写....\models\不可写

PHPUnit - 使用配置文件时出现 'No tests executed'

php - ESP32 尝试使用 HTTPClient 将图像文件发送到 php

php - 3个表之间的Laravel模型关系

java - Kotlin 。 Java 和 PHP 与 MySQL 的性能