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

20 浏览
0 Comments

在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); 
 //不幸的是,这不会返回新的值

我知道我可以进行第二个查询,只需选择值,但我正在尽量减少查询的数量。有没有办法?

0
0 Comments

问题出现的原因是,在MySQL中执行UPDATE语句时,默认返回的是受影响的行数,而不是更新后的值。这对于某些需要获取更新后的值的情况会造成不便。

解决方法是使用存储过程来获取更新后的值。上述代码是对原始代码的修改,通过存储过程来实现更新后获取值的功能。首先创建了一个名为increment_score的存储过程,它接受一个输入参数id_in。在存储过程的主体中,首先将变量设置为NULL,然后执行UPDATE语句来更新item表中的score字段。更新的逻辑是,如果score+1不等于NULL,则将score字段更新为NULL;否则保持原值不变。最后通过SELECT语句返回更新后的值。

通过使用存储过程,我们可以在不运行额外的SELECT语句的前提下,直接获取到更新后的值。这样可以提高查询效率,减少了额外的数据库访问操作。

0
0 Comments

在MySQL中,没有像PostgreSQL的UPDATE ... RETURNING output_expression这样的功能。这个功能可以返回更新后的值,而不仅仅是受影响的行数。

这个问题的出现的原因是MySQL没有提供直接获取更新后的值的方法,只能通过查询来获取更新后的值。这给开发者带来了不便,特别是在需要获取更新后的值进行后续操作的情况下。

解决这个问题的方法是使用SELECT语句来获取更新后的值。首先执行UPDATE语句进行更新操作,然后使用SELECT语句查询更新后的值。代码示例如下:

UPDATE table_name SET column_name = new_value WHERE condition;
SELECT column_name FROM table_name WHERE condition;

通过这种方式,可以获取更新后的值,并进行后续的操作。这样就解决了MySQL没有提供直接获取更新后的值的问题。

希望MySQL未来的版本能够提供类似于PostgreSQL的UPDATE ... RETURNING output_expression的功能,这样可以更方便地获取更新后的值,提高开发效率。

0
0 Comments

问题的原因是用户想要在MySQL中获取更新后的值,而不仅仅是受影响的行数。解决方法是使用存储过程,在存储过程中更新数据并将新值选入输出参数。在PHP中,可以调用存储过程并获取新值。

存储过程的代码如下:

DELIMITER $$   -- 改变DELIMITER以便在存储过程中使用分号
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
$$            -- 结束CREATE PROCEDURE语句
DELIMITER ;   -- 重置DELIMITER为标准分号

在PHP中调用存储过程并获取新值的代码如下:

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

这样做的性能可能会稍微好一些,因为RDBMS不需要解析这两个查询语句,而是在RDBMS端的存储过程中已经编译好了。

至于为什么在UPDATE查询中将id与id_in进行比较,而在SELECT查询中将id与in_id进行比较,这可能只是一个变量声明和第一个查询中的笔误。用户意思是将id_in与id进行比较,这个错误已经被修改。

0