यह व्यवहार दस्तावेज है (कोष्ठक में पैराग्राफ):
<ब्लॉकक्वॉट>यदि आप ON DUPLICATE KEY UPDATE को निर्दिष्ट करते हैं, और एक पंक्ति डाली जाती है जो UNIQUE अनुक्रमणिका या प्राथमिक कुंजी में डुप्लिकेट मान का कारण बनेगी, तो MySQL पुरानी पंक्ति का अद्यतन करता है। उदाहरण के लिए, यदि कॉलम a को अद्वितीय घोषित किया गया है और इसमें मान 1 है, तो निम्नलिखित दो कथनों का समान प्रभाव पड़ता है:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
(प्रभाव इनो डीबी तालिका के लिए समान नहीं हैं जहां ए एक ऑटो-इंक्रीमेंट कॉलम है। ऑटो-इंक्रीमेंट कॉलम के साथ, एक INSERT स्टेटमेंट ऑटो-इंक्रीमेंट वैल्यू को बढ़ाता है लेकिन UPDATE नहीं करता है।)
यहाँ एक सरल व्याख्या है। MySQL पहले डालने का प्रयास करता है। यह तब होता है जब आईडी स्वतः बढ़ जाती है। एक बार बढ़ने के बाद, यह रहता है। फिर डुप्लिकेट का पता लगाया जाता है और अपडेट होता है। लेकिन मान छूट जाता है।
आपको auto_increment
. पर निर्भर नहीं रहना चाहिए कोई अंतराल नहीं होना। यदि यह एक आवश्यकता है, तो अपडेट और इंसर्ट पर ओवरहेड बहुत बड़ा है। अनिवार्य रूप से, आपको पूरी मेज पर एक ताला लगाने की जरूरत है, और उन सभी चीजों को फिर से क्रमांकित करने की आवश्यकता है, जिन्हें आमतौर पर एक ट्रिगर का उपयोग करके पुन:क्रमांकित करने की आवश्यकता होती है। आउटपुट पर वृद्धिशील मानों की गणना करना एक बेहतर उपाय है।