2011-08-07 17 views
10

मैं संभवतः एक प्रश्न में रिकॉर्ड (boolean फ़ील्ड फ़ील्ड) अपडेट करने का प्रयास कर रहा हूं।एक क्वेरी (अद्यतन, सेट और केस) में MySQL अद्यतन स्थितियां

इनपुट पगनेटेड रेडियो नियंत्रण से आ रहा है, इसलिए POST में true या false मान के साथ पृष्ठ के लायक आईडी होंगे।

मैं इस दिशा में जाने के लिए कोशिश कर रहा था:

UPDATE my_table 
    SET field = CASE 
     WHEN id IN (/* true ids */) THEN TRUE 
     WHEN id IN (/* false ids */) THEN FALSE 
    END 

लेकिन इस "सच आईडी" पंक्तियों true के लिए अद्यतन किया जा रहा में हुई, और सभी अन्य पंक्तियों false के लिए अद्यतन किया गया।

मुझे लगता है कि मैंने कुछ सकल वाक्य रचनात्मक त्रुटि बनाई है, या शायद मैं इसे गलत तरीके से देख रहा हूं।

समाधान पर कोई विचार?

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/6734231/mysql-: नीचे कहां खंड को देखो अद्यतन-केस-सहायता) – nawfal

उत्तर

18

क्या आप केस स्टेटमेंट में "ईएलएसई" करना भूल गए थे?

UPDATE my_table 
    SET field = CASE 
     WHEN id IN (/* true ids */) THEN TRUE 
     WHEN id IN (/* false ids */) THEN FALSE 
     ELSE field=field 
    END 

ईएलएसई के बिना, मुझे लगता है कि मूल्यांकन श्रृंखला आखिरी WHEN पर बंद हो जाती है और उस अद्यतन को निष्पादित करती है। साथ ही, आप उन पंक्तियों को सीमित नहीं कर रहे हैं जिन्हें आप अपडेट करने का प्रयास कर रहे हैं; यदि आप ईएलएसई नहीं करते हैं तो आपको कम से कम उन पंक्तियों को अपडेट करने के लिए अपडेट करना चाहिए जिन्हें आप चाहते हैं, न कि सभी पंक्तियां (जैसा कि आप कर रहे हैं)।

UPDATE my_table 
     SET field = CASE 
      WHEN id IN (/* true ids */) THEN TRUE 
      WHEN id IN (/* false ids */) THEN FALSE 
     END 
    WHERE id in (true ids + false_ids) 
+0

धन्यवाद @ इकरस - आपके द्वारा पोस्ट किया गया दूसरा समाधान सही है। जबकि पाठ्यक्रम का पहला काम करता है, MySQL तालिका में प्रत्येक पंक्ति से मेल खाता है; ऐसा लगता है कि यह वास्तव में बड़ी पंक्तियों को अपडेट करता है, जो कि वास्तव में बड़ी पंक्तियों में प्रदर्शन हानि का कारण बनता है (* 10^6 पंक्तियां या अधिक *)। क्या आप इस पर कुछ प्रकाश डाल सकते हैं? (* सभी लक्षित आईडी के संघ पर शर्त एक साफ पर्याप्त समाधान है, लेकिन मैं सिर्फ उत्सुक हूं * – Dan

+1

@TomcatExodus: मुझे यकीन नहीं है कि मैं आपके प्रश्न को काफी समझता हूं लेकिन, सामान्यतः, यदि आपके पास कोई अपडेट नहीं है जहां डेटाबेस इंजन को क्लॉज लगभग निश्चित रूप से टेबल स्कैन करना होगा और विशेष रूप से बड़ी टेबल पर प्रदर्शन को चोट पहुंचाएगा। तो हाँ, वहां पर जहां क्लॉज होना चाहिए तेज़ होना चाहिए, लेकिन केवल तभी आईडी कॉलम एक इंडेक्स है। यदि ऐसा नहीं है, तो तालिका स्कैन अपरिहार्य है। – Icarus

+0

ठीक @ इकरस - यही मेरा मतलब था, 'आईडी' कॉलम अनुक्रमित है। मैं आउटपुट स्ट्रीम का जिक्र कर रहा था; 'WHERE' खंड के बिना, मुझे कई हजार पंक्तियां मिलती हैं, लेकिन केवल कुछ मुट्ठी भर प्रभावित होती हैं। जिन हजारों का मिलान किया जा रहा है वह पूर्ण टेबल स्कैन है जिसे मैं टालना चाहता हूं, और * WHERE' क्लॉज लागू करके * * से बचा है, केवल सत्य/झूठी आईडी के एक संघ को निर्दिष्ट करता है। बस कुछ स्पष्टीकरण चाहिए था। धन्यवाद! – Dan

4

आप बच सकते हैं क्षेत्र = क्षेत्र

update my_table 
    set field = case 
     when id in (....) then true 
     when id in (...) then false 
     else field 
    end 
[MySQL अद्यतन मामले सहायता] (की
+0

धन्यवाद @ निक नियम - 'फ़ील्ड = फ़ील्ड' पहली नज़र में भी अजीब लग रहा था (* फ़ील्ड = फ़ील्ड = फ़ील्ड? *) – Dan

संबंधित मुद्दे