Получить обновленное значение в MySQL вместо затронутых строк - PullRequest
24 голосов
/ 16 сентября 2011

Я пытался найти ответ на этот вопрос, но во всех моих исследованиях не нашел однозначного "да" или "нет".

Я выполняю простой запрос MySQL, напримерthis:

 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

Я знаю, что могу сделать второй запрос и просто выбрать значение, но я пытаюсь сократитьмаксимально сократить количество запросов.Есть ли способ?

Ответы [ 5 ]

22 голосов
/ 16 сентября 2011

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

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

1 голос
/ 09 августа 2015

Если вы не хотите запускать другой запрос 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 ;
0 голосов
/ 16 сентября 2011

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

0 голосов
/ 16 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...