php - mysqli_affected_rows - Obtener valor actualizado en MySQL en lugar de filas afectadas
mysqli_num_rows (5)
He estado tratando de encontrar una respuesta a esta pregunta, pero no he encontrado ningún "sí" o "no" definitivo en todas mis investigaciones.
Estoy ejecutando una consulta de MySQL simple como esta:
UPDATE item SET `score`=`score`+1 WHERE `id`=1
¿Hay alguna forma de que la consulta devuelva el valor actualizado, en lugar del número de filas afectadas? Solo como referencia, estoy haciendo esto en PHP, para que el código real se vea como:
$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?
No, no hay nada como la ACTUALIZACIÓN de postgresql ... RETORRAR output_expression en MySQL (¿todavía?).
No, no puedes. Podría realizar una función o un procedimiento almacenado que podría hacer la inserción y devolver el valor actualizado, pero que 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.
Puede hacerlo con un procedimiento almacenado que se actualice, y luego seleccione el nuevo valor en un parámetro de salida. Lo siguiente 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''];
Si no desea ejecutar otra consulta 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 ;