2012-08-08 13 views
6

मैंने कुछ शोध किया है लेकिन मेरी ज़रूरतों को पूरा करने के लिए कुछ भी नहीं लगता है। मेरे पास एक डेटाबेस तालिका है जिसमें webservice से कुछ डेटा पुनर्प्राप्त किया गया है।डिप्लिकेट ऑन डिप्लीकेट कुंजी अपडेट

उपयोगकर्ता प्रत्येक रिकॉर्ड के लिए कुछ कार्य करता है, और उसके बाद इसे "संसाधित" के रूप में चिह्नित करता है। तो मेरे पास एक अतिरिक्त डीबी फ़ील्ड है (जिसे मैं डब्ल्यूएस से प्राप्त डेटा पर आधारित नहीं है) नामित "संसाधित" नाम दिया गया है जो डिफ़ॉल्ट रूप से 0 पर सेट किया गया है, और 1 जब उपयोगकर्ता ने अपना काम किया है।

प्रत्येक दिन मैं डब्ल्यूएस की जांच करता हूं, और यदि स्थिति कोड बदलता है तो मैं पंक्ति को अपडेट करना चाहता हूं और वापस 0 पर संसाधित करना चाहता हूं (इसलिए उपयोगकर्ता इसे फिर से संभाल सकता है)।

चलो कहते हैं कि यह मेरा db है चलो ...

+------+------------+-------+------------+ 
| id | statuscode | foo | processed | 
+------+------------+-------+------------+ 
| 123 | 66   | bar | 1   | 
+------+------------+-------+------------+ 
  • अगर वहाँ एक ही कुंजी (आईडी) मैं एक नया रिकार्ड सम्मिलित करना चाहते हैं के साथ एक पंक्ति नहीं है।
  • यदि एक ही कुंजी और 'foo' परिवर्तन के साथ कोई पंक्ति है, तो मैं 'संसाधित' फ़ील्ड को छोड़कर किसी भी मान को अपडेट करना चाहता हूं।
  • वहाँ कुछ के साथ एक ही कुंजी और statusCode परिवर्तन के साथ एक पंक्ति मैं किसी भी मूल्य को अपडेट करना चाहते और 0.

को संसाधित सेट मुझे लगता है कि कुछ शर्त के साथ पर नकली चाबी अद्यतन यह काम कर सकता है कि है, हो सकता है तो मामला या अगर स्थिति ... क्या मैं गलत हूँ? कोई सुझाव अच्छा है, अग्रिम धन्यवाद!

+0

कैसे यू 'foo पता लगाने के लिए जा रहे हैं 'परिवर्तन? क्या आपके पास foo कॉलम के खिलाफ इसे जांचने के लिए खुद का मूल्य है ?? – nawfal

उत्तर

7

कुछ इस तरह (चेतावनी: NULL मान नहीं का ध्यान रखा):

INSERT INTO tableX 
    (id, statuscode, foo, processed) 
VALUES 
    (?, ?, ?, DEFAULT) 
ON DUPLICATE KEY UPDATE 
    processed = CASE WHEN statuscode <> VALUES(ststuscode) 
        THEN 0 
        ELSE processed 
       END 
, statuscode = VALUES(statuscode) 
, foo = VALUES(foo) ; 
+0

फ़ील्ड फू और स्टेटसोड के लिए दो और जांच नहीं होनी चाहिए? – nawfal

+0

@nawfal: दो और? क्यूं कर? यदि 'foo' परिवर्तन अप्रासंगिक है या नहीं, तो इसे' ELSE' भाग से लिया जाता है। –

+0

केवल अगर फू या स्टेटसोड बदलता है, तो तभी वह अन्य फ़ील्ड को अपडेट करने योग्य बनाना चाहता है। मेरा जवाब देखें, आप समझेंगे कि मैं – nawfal

1

एक और उत्तर यहाँ से थोड़ा सा संशोधन, यह करना चाहिए:

INSERT INTO tableX (id, statuscode, foo, processed) 
      VALUES (@id, @statuscode, @foo, @processed) 
ON DUPLICATE KEY UPDATE 
         foo = IF (statuscode != VALUES(statuscode) OR foo != VALUES(foo), VALUES(foo), foo), 
         statuscode = IF (statuscode != VALUES(statuscode) OR foo != VALUES(foo), VALUES(statuscode), statuscode), 
         processed = IF (statuscode != VALUES(statuscode), 0, processed) 
संबंधित मुद्दे