我一直在努力寻找这个问题的答案,但在我所有的研究中都没有找到任何明确的"是"或"否"。
我正在运行一个简单的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
我知道我可以做第二个查询,只是选择值,但我正试图减少查询尽可能多。有办法吗?
您可以使用更新的存储过程来完成,然后将新值选择到输出参数中。下面的代码返回一列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'];
不,没有什么像postgresql的UPDATE…
如果您不想运行另一个查询SELECT,那么这里有另一种方法。我修改了Mr. 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 ;
不行。您可以创建一个函数或存储过程来执行插入操作并返回更新后的值,但这仍然需要在函数或存储过程中执行两个查询。
您可以创建一个触发器,并且您将知道关于修改的所有信息。