Получать обновленное значение в 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
Я знаю, что могу сделать второй запрос и просто ВЫБРАТЬ значение, но я стараюсь как можно больше сократить запросы. Есть ли способ?
Ответы
Ответ 1
Вы можете сделать это с помощью хранимой процедуры, которая обновляется, а затем выбирает новое значение в выходной параметр.
Следующее возвращает один столбец 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'];
Ответ 2
Нет, нет ничего похожего на postgresql UPDATE... RETURNING output_expression в MySQL (пока?).
Ответ 3
Если вы не хотите запускать еще один запрос 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 ;
Ответ 4
Нет, вы не можете. Вы можете создать функцию или хранимую процедуру, которая могла бы вставлять и возвращать обновленное значение, но все равно потребуется выполнить два запроса внутри функции или хранимой процедуры.
Ответ 5
Вы можете создать триггер, и вы узнаете все об изменениях.