2011-09-16 18 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 प्रदर्शन शायद थोड़ा बेहतर होगा क्योंकि आरडीबीएमएस को किसी भी प्रश्न का विश्लेषण नहीं करना पड़ेगा। दोनों आरडीबीएमएस की तरफ से प्रक्रिया में संकलित हैं। –

+2

@jwegner Benchmark यह सुनिश्चित करने के लिए हालांकि ... –

10

नहीं, MySQL (अभी तक?) में postgresql के UPDATE ... RETURNING output_expression जैसे कुछ भी नहीं है।

+3

वास्तव में प्रश्न के साथ मदद नहीं करता है (यदि वास्तव में कोई जवाब है), लेकिन जानकारी के एक दिलचस्प टुकड़े के लिए +1! –

0

नहीं आप नहीं कर सकते। आप एक फ़ंक्शन या संग्रहीत प्रक्रिया कर सकते हैं जो सम्मिलित कर सकता है और अद्यतन मान वापस कर सकता है लेकिन फिर भी आपको फ़ंक्शन या संग्रहीत प्रक्रिया के भीतर से दो प्रश्न निष्पादित करने की आवश्यकता होगी।

-1

आप ट्रिगर बना सकते हैं, और आप संशोधनों के बारे में सब कुछ पता चल जाएगा।

1

यदि आप कोई और क्वेरी चयन नहीं करना चाहते हैं तो यह करने का एक और तरीका है। मैंने संदर्भ के लिए श्री बर्कोस्की कोड को संशोधित किया है:

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 ; 
संबंधित मुद्दे