2011-09-16 153 views
24

我一直在試圖找到這個問題的答案,但在我的所有研究中都沒有發現任何明確的「是」或「否」。在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 

我知道我可以做第二次查詢,只要選擇的價值,但我想上砍下儘可能查詢。有沒有辦法?

+0

不,我不認爲有。 –

回答

22

您可以使用更新的存儲過程來完成此操作,然後將新值輸入到輸出參數中。 以下內容將返回一列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']; 
+1

在存儲過程中執行此操作的性能是否比只執行兩個SQL查詢更好? – jwegner

+0

@jwegner性能可能會好一點,因爲RDBMS不必解析任何一個查詢。兩者已經在RDBMS方面的程序中編譯。 –

+2

@jwegner通過基準測試,雖然... –

0

不,你不能。您可以創建一個函數或存儲過程來執行插入操作並返回更新後的值,但仍需要您從函數或存儲過程中執行兩個查詢。

-1

您可以創建一個觸發器,你就會知道關於修改的一切。

1

如果你不想運行另一個查詢選擇,那麼這裏是另一種方法來做到這一點。我已經修改了Berkowski先生的代碼以供參考:

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 ; 
相關問題