获取MySQL中的更新值而不是受影响的行

时间:2011-09-16 14:17:48

标签: php mysql

我一直试图找到这个问题的答案,但在我的所有研究中都没有找到任何明确的“是”或“否”。

我正在运行这样一个简单的MySQL查询:

 UPDATE item SET `score`=`score`+1 WHERE `id`=1

该查询是否有办法返回更新后的值,而不是受影响的行数?作为参考,我在PHP中这样做,所以实际代码如下:

 $sql = "UPDATE item SET `score`=`score`+1 WHERE `id`=1";
 $new_value = mysql_query($sql); 
 //Unfortunately this does not return the new value

我知道我可以做第二次查询而只是选择值,但我正在尝试尽可能减少查询。有办法吗?

5 个答案:

答案 0 :(得分:22)

您可以使用更新的存储过程执行此操作,然后在输出参数中选择新值。 以下内容返回一列new_score,其中包含新值。

DELIMITER $$   -- Change DELIMITER in order to use ; withn the procedure
CREATE PROCEDURE increment_score
(
   IN id_in INT
)
BEGIN
    UPDATE item SET score = score + 1 WHERE id = id_in;
    SELECT score AS new_score FROM item WHERE id = id_in;
END
$$            -- Finish CREATE PROCEDURE statement
DELIMITER ;   -- Reset DELIMITER to standard ;

在PHP中:

$result = mysql_query("CALL increment_score($id)");
$row = mysql_fetch_array($result);
echo $row['new_score'];

答案 1 :(得分:11)

不,在MySQL中没有像postgresql的UPDATE ... RETURNING output_expression那样(但是?)。

答案 2 :(得分:1)

如果您不想运行另一个Query SELECT,那么这是另一种方法。我修改了Berkowski先生的代码以供参考:

DELIMITER $$
CREATE PROCEDURE increment_score
(
   IN id_in INT
)
BEGIN
    set @newScore := null;
    UPDATE item SET score = IF((@newScore := score+1) <> NULL IS NULL, @newScore, NULL) WHERE id = id_in;
    SELECT @newScore;
END
DELIMITER ;

答案 3 :(得分:0)

不,你不能。您可以创建一个可以执行插入并返回更新值的函数或存储过程,但这仍然需要您在函数或存储过程中执行两个查询。

答案 4 :(得分:-1)

您可以创建一个触发器,并且您将了解有关修改的所有信息。