2013-02-15 43 views
45

क्या MySQL में एक अद्यतन क्वेरी करना संभव है जो केवल कुछ निश्चित स्थिति मिलने पर फ़ील्ड मान अपडेट करता है? कुछ इस तरह:MySQL: यदि स्थिति पूरी हो जाती है तो केवल फ़ील्ड अपडेट करें

UPDATE test 
SET 
    CASE 
     WHEN true 
     THEN field = 1 
    END 
WHERE id = 123 

दूसरे शब्दों में:

UPDATE test 
SET 
    something = 1,  /*field that always gets updated*/ 
    CASE 
     WHEN true 
     THEN field = 1 /*field that should only get updated when condition is met*/ 
    END 
WHERE id = 123 

यह करने के लिए उचित तरीका क्या है?

+1

एकमात्र कारण पूरा किया जाता है अद्यतन करेगा है अगर आप पर निर्भर करता है अलग ढंग से पंक्तियों को अपडेट करना चाहते एक शर्त। यदि आप बस कुछ पंक्तियों को अपडेट करना चाहते हैं, तो बस उस खंड में स्थितियां जोड़ें जहां खंड। – SilverSnake

उत्तर

87

हाँ!

यहाँ आप एक और उदाहरण है:

UPDATE prices 
SET final_price= CASE 
    WHEN currency=1 THEN 0.81*final_price 
    ELSE final_price 
END 

यह काम करता है क्योंकि MySQL, पंक्ति को अद्यतन नहीं करता है तो वहाँ कोई परिवर्तन नहीं, as mentioned in docs है:

आप मूल्य के लिए एक स्तंभ सेट करते हैं वर्तमान में, MySQL यह नोटिस करता है और इसे अपडेट नहीं करता है।

+4

"फ़ील्ड" केवल तभी अपडेट किया जाएगा जब स्थिति पूरी हो जाती है, ** अन्यथा कुछ भी नहीं किया जाता है। ** –

+0

हां! वास्तव में मैं इसे क्या करना चाहता हूं। – fedorqui

+2

'WHERE मुद्रा = 1' के बारे में क्या? –

14

इस प्रयास करें:

UPDATE test 
SET 
    field = 1 
WHERE id = 123 and condition 
+2

नहीं, लॉल ... मेरा मतलब है कि मैं पोस्ट में आया था, और किसी ने आपको बिना किसी कारण के नीचे गिरा दिया, इसलिए मैंने सोचा कि मैं कम से कम अपने स्कोर पर "प्रभाव को कम करने" में मदद करूंगा :) मैं वह नहीं था जिसने इसे कम किया था। – Sarel

+1

मैंने इसे फिर से डाउनोट किया ... क्योंकि यह समस्या का हल समाधान भी नहीं है ... यह मुझे पहेली करता है कि लोग इस – Dominique

+0

@ डोमिनिक को कैसे उखाड़ फेंकते हैं, हो सकता है कि आप शब्द 'स्थिति' पर त्रुटि से उलझन में हैं? –

13

एक अन्य समाधान है जो, मेरी राय में, पढ़ने में आसान है होगा:

UPDATE test SET something = 1, field = IF(condition is true, 1, field) WHERE id = 123 

क्या इस करता है 1 (ओ पी की तरह उदाहरण के रूप में प्रयोग किया जाता) के लिए 'क्षेत्र' सेट है, तो स्थिति उत्पन्न होने पर और यदि नहीं मिले तो 'फ़ील्ड' के वर्तमान मूल्य का उपयोग करें। पिछले मान का उपयोग करना बदलना जैसा नहीं है, इसलिए आप वहां जाते हैं।

0

एक और भिन्नता:

UPDATE test 
SET field = IF ({condition}, {new value}, field) 
WHERE id = 123 

इस field{new value} साथ ही अगर {condition} अद्यतन क्वेरी में मामले का उपयोग करने के