Получать обновленное значение в 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 

Я знаю, что могу выполнить второй запрос и просто ВЫБРАТЬ значение, но я стараюсь как можно больше сократить запросы. Есть ли способ?

Вы можете сделать это с помощью хранимой процедуры, которая обновляется, а затем выбирает новое значение в выходной параметр. Следующий возвращает один столбец 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']; 

Нет, нет ничего похожего на UPDATE от postgresql … RETURNING output_expression в MySQL (еще?).

Если вы не хотите запускать еще один запрос SELECT, вот еще один способ сделать это. Я изменил код г-на Берковского для справки:

 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 ; 

Нет, вы не можете. Вы можете создать функцию или хранимую процедуру, которая могла бы вставлять и возвращать обновленное значение, но все равно потребуется выполнить два запроса из функции или хранимой процедуры.

Вы можете создать триггер, и вы узнаете все об изменениях.