7

我有一个尝试插入记录的语句,如果它已经存在,它只是更新记录。

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 变量来做到这一点吗,我在搜索后还没有找到一种方法来做到这一点。

4

5 回答 5

6

来自Mysql 文档

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

mysql_affected_rows()在查询后使用,如果INSERT执行了它会给你1,如果UPDATE执行了它会给你2

于 2013-06-13T12:26:07.467 回答
3

我知道这有点老了,但是我在 PHP 中进行了批量插入,并且需要确切地知道插入和更新了多少行(分别)。

所以我用了这个:

$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;

简单的跟踪表:

-------------------------------
| data | affected | ins | upd |
-------------------------------
|    1 |        1 |   1 |   0 |
-------------------------------
|    2 |        2 |   2 |   0 |
|    2 |        3 |   1 |   1 |
|    2 |        4 |   0 |   2 |
-------------------------------
|    3 |        3 |   3 |   0 |
|    3 |        4 |   2 |   1 |
|    3 |        5 |   1 |   2 |
|    3 |        6 |   0 |   3 |
-------------------------------
|    4 |        4 |   4 |   0 |
|    4 |        5 |   3 |   1 |
|    4 |        6 |   2 |   2 |
|    4 |        7 |   1 |   3 |
|    4 |        8 |   0 |   4 |
-------------------------------
|    5 |        5 |   5 |   0 |
|    5 |        6 |   4 |   1 |
|    5 |        7 |   3 |   2 |
|    5 |        8 |   2 |   3 |
|    5 |        9 |   1 |   4 |
|    5 |       10 |   0 |   5 |
-------------------------------
于 2015-09-16T14:02:05.687 回答
3

我已经使用 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 标志,如果现有行设置为其当前值,则受影响的行值为 1(而不是 0)。

旁注- 我在 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>";

希望我在删除机密数据的同时重新创建它以共享它,因此我没有打错任何字。

希望这可以帮助某人。祝你编码好运!

于 2016-05-17T15:42:15.890 回答
0

如果要分别获取已插入和更新的记录数,则要分别发出每个语句。

于 2013-06-13T12:18:04.873 回答
-1

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

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

于 2013-06-13T12:25:58.483 回答