Obtenga un valor actualizado en MySQL en lugar de filas afectadas

He intentado encontrar una respuesta a esta pregunta, pero no he encontrado ningún “sí” o un “no” definitivo en todas mis investigaciones.

Estoy ejecutando una simple consulta de MySQL como esta:

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

¿Hay alguna forma de que esa consulta devuelva el valor actualizado, en lugar del número de filas afectadas? Solo como referencia, estoy haciendo esto en PHP, así que el código actual se ve así:

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

Sé que podría hacer una segunda consulta y simplemente SELECCIONAR el valor, pero estoy tratando de reducir las consultas tanto como sea posible. ¿Hay alguna manera?

Puede hacerlo con un procedimiento almacenado que se actualiza y luego selecciona el nuevo valor en un parámetro de salida. A continuación, se devuelve una columna new_score con el nuevo valor.

 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 ; 

En PHP:

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

No, no hay nada como UPDATE de postgresql … DEVOLVER output_expression en MySQL (¿todavía?).

Si no desea ejecutar otro Query SELECT, aquí hay otra forma de hacerlo. He modificado el código del Sr. Berkowski para referencia:

 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 ; 

No, no puedes Podría hacer una función o procedimiento almacenado que podría hacer la inserción y devolver el valor actualizado, pero eso aún requeriría que ejecute dos consultas desde la función o el procedimiento almacenado.

Puede crear un disparador y sabrá todo sobre las modificaciones.