2011-09-16 4 views
24

私はこの質問に対する答えを見つけようとしていますが、私のすべての研究で明確な「はい」または「いいえ」が見つかりませんでした。影響を受けた行の代わりにMySQLで更新された値を取得

私はこのような単純なMySQLのクエリを実行している:

UPDATE item SET `score`=`score`+1 WHERE `id`=1 

は、そのクエリではなく、影響を受けた行数の更新された値を、返すための方法はありますか?私は2番目のクエリを実行すると、単に値を選択することができます知っているが、私がダウンして上のカットしようとしている

$sql = "UPDATE item SET `score`=`score`+1 WHERE `id`=1"; 
$new_value = mysql_query($sql); 
//Unfortunately this does not return the new value 

:ちょうど参照として、私はPHPでこれをやっているので、実際のコードは次のようになります可能な限り問い合わせを行います。方法はありますか?

+0

いいえ、私はないと思います。 –

答えて

22

出力パラメータに新しい値を更新して選択するストアドプロシージャを使用すると、この操作を実行できます。 次の例では、1つの列new_scoreが新しい値で返されます。 PHPで

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 ; 

$result = mysql_query("CALL increment_score($id)"); 
$row = mysql_fetch_array($result); 
echo $row['new_score']; 
+1

これをストアドプロシージャで実行すると、2つのSQLクエリを実行するよりもパフォーマンスが向上しますか? – jwegner

+0

@jwegner RDBMSはどちらのクエリも解析する必要がないため、パフォーマンスは多少向上します。どちらもすでにRDBMS側の手順でコンパイルされています。 –

+2

@jwegner確かにそれをベンチマークする... –

10

いいえ、postgresqlのUPDATE ... RETURNING output_expressionのようなものはありません(まだですか?)。

+3

質問には実際には役に立ちませんが(実際には答えがある場合)、興味深い情報に+1してください! –

0

いいえ、あなたは傾けません。挿入を行い、更新された値を返す関数またはストアドプロシージャを作成できますが、それでも関数またはストアドプロシージャ内から2つのクエリを実行する必要があります。

-1

あなたはトリガーを作成することができ、あなたが変更についてのすべてを知っているだろう。

1

別のクエリ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 ; 
関連する問題