从ON DUPLICATE KEY UPDATE获取插入/更新行的计数

时间:2013-06-13 12:13:12

标签: mysql sql on-duplicate-key

我有一个试图插入记录的声明,如果它已经存在,它只是更新记录。

INSERT INTO temptable (col1,col2,col3)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2), col3=VALUES(col3);

完整语句有多个插入,我希望根据UPDATE计算INSERT数。我可以用MySQL变量做这个,我还没有找到一种方法来搜索。

5 个答案:

答案 0 :(得分:3)

来自Mysql Docs

  

在“INSERT ... ON DUPLICATE KEY UPDATE”查询的情况下,如果执行了插入,则返回值为1,或者对于现有行的更新,返回值为2.

在您的查询后使用mysql_affected_rows(),如果执行了INSERT,它将为您提供1,如果UPDATE已执行,它将为您提供2。< / p>

答案 1 :(得分:2)

我已经使用while循环完成了您所描述的内容,因此每次迭代都会创建一个影响一行的MySQL语句。在循环中,我运行mysql_affected_rows(),然后根据返回的值是0还是1递增计数器。在循环结束时,我回显两个变量以供查看。

MySQL Docs关于mysql_affected_rows函数的完整措辞是(注意返回了3个可能的值 - 0,1或2):

  

对于INSERT ... ON DUPLICATE KEY UPDATE语句,受影响的行   如果将行作为新行插入,则每行的值为1;如果是,则为2   更新现有行,如果现有行设置为更新,则为0   当前价值。如果指定CLIENT_FOUND_ROWS标志,则   如果将现有行设置为,则af​​fected-rows值为1(不为0)   当前价值。

Sidenote - 我在while循环之前将$ countUpdate和$ countInsert以及$ countUpdateNoChange设置为0):

以下是我开发的适用于我的代码:

while (conditions...) {    
$sql = "INSERT INTO test_table (control_number, name) VALUES ('123', 'Bob')
    ON DUPLICATE KEY UPDATE name = 'Bob'";  

    mysql_query($sql) OR die('Error: '. mysql_error()); 

    $recordModType = mysql_affected_rows();

    if ($recordModType == 0) {
         $countUpdateNoChange++;
    }elseif($recordModType == 1){
         $countInsert++;
    }elseif($recordModType == 2){
         $countUpdate++;
    };
};

echo $countInsert." rows inserted<br>";
echo $countUpdateNoChange." rows updated but no data affected<br>";
echo $countUpdate." rows updated with new data<br><br>";

希望我没有做出任何错别字,因为我在删除机密数据时重新创建了它。

希望这有助于某人。祝你好运!

答案 2 :(得分:1)

我知道这有点旧,但我在PHP中进行批量插入,需要确切地知道插入和更新了多少行(单独)。

所以我用过这个:

function dataMethod(name: string, options: any) {        
    return (target: any, propertyKey: string, descriptor?: TypedPropertyDescriptor<any>) => {        

    }
}

简单跟踪表:

$dataCount = count($arrData); // number of rows in the statement
$affected  = mysql_affected_rows(); // mysqli_*, PDO's rowCount() or anything

$updated  = $affected - $dataCount;
$inserted = 2 * $dataCount - $affected;

答案 3 :(得分:0)

如果你想获得已经插入和更新的记录数量,那么你将逐步发布每个语句。

答案 4 :(得分:0)

您应该在查询后使用mysql_affected_rows()

http://dev.mysql.com/doc/refman/5.1/en/mysql-affected-rows.html