我有一个试图插入记录的声明,如果它已经存在,它只是更新记录。
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变量做这个,我还没有找到一种方法来搜索。
答案 0 :(得分:3)
在“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标志,则 如果将现有行设置为,则affected-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