INSERT में ... डुप्लीकेट कुंजी अद्यतन से चुनें ...


116

अगर मैं एक अद्वितीय कुंजी पहले से मौजूद है, तो एक सम्मिलित क्वेरी कर रहा हूँ, जहाँ कई स्तंभों को नए मानों को अद्यतन करने की आवश्यकता होगी। यह कुछ इस तरह चलता है:

INSERT INTO lee(exp_id, created_by, 
                location, animal, 
                starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE ...; 
//update all fields to values from SELECT, 
//       except for exp_id, created_by, location, animal, 
//       starttime, endtime

मुझे यकीन नहीं है कि UPDATEखंड के लिए वाक्यविन्यास क्या होना चाहिए। मैं SELECTक्लॉज से वर्तमान पंक्ति को कैसे संदर्भित करूं ?

जवाबों:


172

MySQL INSERT INTO क्लॉज में नामित कॉलम के संदर्भ के बराबर भाग को मान लेगा, और दूसरा भाग SELECT कॉलम को संदर्भित करता है।

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ...

6
@dnagirl: TIP: पीके कॉलमों में से किसी को भी अपडेट करने की कोशिश न करें, केवल जिन्हें अपडेट करने की जरूरत है वे सूची में जाएं
lexu

45
आपके सुझाए गए सिंटैक्स काम करता है और t.आवश्यक है। मुझे xaprb ( xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql ) पर एक लेख मिला है जो इस वाक्य रचना का उपयोग करता है on duplicate key update b = values(b), c = values(c):। यह भी काम करता है।
dnagirl

9
नोट: यह तब काम नहीं करेगा जब SELECT स्टेटमेंट में GROUP BY क्लॉज हो
joHN

11
@ जॉन यदि SELECT कथन BY खंड एक समूह है क्या करना है
Kathir

2
dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html MySQL में 5.6.4 और बाद में, INSERT कहते हैं ... DUPLICATE KEY पर अपडेट करें स्टेटमेंट स्टेटमेंट स्टेटमेंट प्रतिकृति के लिए असुरक्षित के रूप में चिह्नित किए जाते हैं। ... इसके अलावा, MySQL 5.6.6 के साथ शुरुआत, एक INSERT ... एक से अधिक अद्वितीय या प्राथमिक कुंजी रखने वाली तालिका के खिलाफ DUPLICATE कुंजी पर स्टेटमेंट को भी असुरक्षित के रूप में चिह्नित किया गया है। '
अब्दुल मुनीर

51

हालाँकि मुझे इसमें बहुत देर हो गई है, लेकिन जो लोग क्लॉज़ के INSERT-SELECTसाथ क्वेरी का उपयोग करना चाहते थे, उनके लिए कुछ वैध प्रश्न देखने के बाद GROUP BY, मैं इसके लिए काम के साथ आया।

आगे की जवाब लेते हुए मार्कस एडम्स और लेखांकन GROUP BYउस में, यह कैसे मैं का उपयोग करके समस्या का समाधान होता हैSubqueries in the FROM Clause

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT sb.id, uid, sb.location, sb.animal, sb.starttime, sb.endtime, sb.entct, 
       sb.inact, sb.inadur, sb.inadist, 
       sb.smlct, sb.smldur, sb.smldist, 
       sb.larct, sb.lardur, sb.lardist, 
       sb.emptyct, sb.emptydur
FROM
(SELECT id, uid, location, animal, starttime, endtime, entct, 
       inact, inadur, inadist, 
       smlct, smldur, smldist, 
       larct, lardur, lardist, 
       emptyct, emptydur 
FROM tmp WHERE uid=x
GROUP BY location) as sb
ON DUPLICATE KEY UPDATE entct=sb.entct, inact=sb.inact, ...

8
COUNT, GROUP आदि प्रश्नों के लिए यह सही उत्तर है। धन्यवाद।
कोस्टानोस

बहुत बहुत धन्यवाद, दोस्त! मुझे वास्तव में यह दृष्टिकोण पसंद आया, विशेष रूप से क्योंकि यह मुझे निरंतर तंत्र की तरह एक तंत्र बनाने की अनुमति देता है, कुछ ऐसा जो कि इन्फ्लक्सबीडी करता है।
मिरे

1
आप डुप्लिकेट अपडेट में फ़ील्ड = VALUES (फ़ील्ड) का भी उपयोग कर सकते हैं जैसा कि stackoverflow.com/questions/16935896/… के
Erik Melkersson
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.