2011-09-16 16 views
24

Bu soruya bir yanıt bulmaya çalışıyorum, ancak araştırmalarımda kesinlikle "evet" veya "hayır" bulunmadı. etkilenen yerine satır sayısı,Etkilenen satırlar yerine MySQL içinde Güncel Değer Alın

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

güncellenmiş değeri döndürmek için söz konusu sorgu için bir yolu var mı:

Böyle basit bir MySQL sorgusu koşuyorum? Sadece bir referans olarak, gibi gerçek kod görünüyor yüzden, PHP yapıyorum: Ben ikinci bir sorgu yapmak ve sadece değerini SEÇ biliyorum

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

ama azaltmak için çalışıyorum Mümkün olduğunca çok sorgular. Bir yolu var mı?

+0

Hayır, olduğunu sanmıyorum. –

cevap

22

Güncelleştirilen bir saklı yordam ile yapabilir ve sonra yeni değeri bir çıkış parametresine seçer. Aşağıdaki, yeni değerle bir sütun new_score değerini döndürür. 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

Bunu, iki SQL sorgusu yapmaktan daha iyi bir saklı yordamda gerçekleştirmenin performansı var mı? – jwegner

+0

@jwegner Performans muhtemelen biraz daha iyi olacaktır, çünkü RDBMS sorgulardan herhangi birini ayrıştırmak zorunda değildir. Her ikisi de RDBMS'nin tarafındaki prosedürde zaten hazırlanmıştır. –

+2

@jwegner Ancak emin olmak için benchmark ... –

10

Hayır, MySQL'de postgresql'nin UPDATE ... RETURNING output_expression gibi bir sürümü yok (henüz?).

+3

Soruya gerçekten yardımcı olmuyor (eğer gerçekten bir cevap varsa), ama ilginç bir bilgi parçası için +1! –

0

Hayır yapamazsınız. Eklenen ve geri yüklenen değeri döndüren ancak yine de işlevin veya saklı yordamın içinden iki sorgu yürütmenizi gerektiren bir işlev veya saklı yordam gerçekleştirebilirsiniz.

-1

Bir tetikleyici oluşturmak yapabilir ve modifikasyonlar ile ilgili her şeyi bilecek.

1

Başka bir Sorgu SELECT'i çalıştırmak istemiyorsanız, bunu yapmak için başka bir yoldur. Berkowski kodunu, referans için değiştirdim:

İlgili konular