MySQL और HSQLDB दोनों द्वारा समर्थित एकमात्र समाधान उन पंक्तियों को क्वेरी करना है जिन्हें आप बदलना चाहते हैं, और सशर्त रूप से INSERT या UPDATE। इसका मतलब है कि आपको RDBMS कार्यान्वयन के बीच अंतर की भरपाई के लिए अधिक एप्लिकेशन कोड लिखना होगा।
- लेनदेन शुरू करें।
- चुनें ... अपडेट के लिए।
- यदि चयन पंक्तियों को ढूंढता है, तो अद्यतन करें।
- अन्यथा, सम्मिलित करें।
- कमिट करें।
MySQL ANSI SQL MERGE कथन का समर्थन नहीं करता है। यह डुप्लीकेट कुंजी अद्यतन पर प्रतिस्थापन और सम्मिलित करें... का समर्थन करता है। मेरा जवाब देखें " INSERT IGNORE" बनाम "INSERT ... ON DUPLICATE KEY UPDATE" उस पर और अधिक के लिए।
पुन:टिप्पणियाँ:हाँ, एक और तरीका है कि बस INSERT को आज़माएँ और देखें कि क्या यह सफल होता है। अन्यथा, एक अद्यतन करें। यदि आप INSERT का प्रयास करते हैं और यह एक डुप्लिकेट कुंजी हिट करता है, तो यह एक त्रुटि उत्पन्न करेगा, जो कुछ क्लाइंट इंटरफेस में अपवाद में बदल जाता है। MySQL में ऐसा करने का नुकसान यह है कि INSERT विफल होने पर भी यह एक नई ऑटो-इन्क्रीमेंट आईडी बनाता है। तो आप अंतराल के साथ समाप्त हो जाते हैं। मुझे पता है कि ऑटो-इंक्रीमेंट सीक्वेंस में अंतराल आमतौर पर चिंता का विषय नहीं है, लेकिन मैंने पिछले साल एक ग्राहक की मदद की, जिसके इस प्रभाव के कारण सफल इंसर्ट के बीच 1000-1500 का अंतराल था, और इसका परिणाम यह हुआ कि उन्होंने एक की सीमा समाप्त कर दी। INT उनकी प्राथमिक कुंजी में।
जैसा कि @baraky कहते हैं, कोई इसके बजाय पहले अद्यतन का प्रयास कर सकता है, और यदि यह शून्य पंक्तियों को प्रभावित करता है, तो इसके बजाय INSERT करें। इस रणनीति पर मेरी टिप्पणी यह है कि शून्य पंक्तियों को अद्यतन करना कोई अपवाद नहीं है -- आपको यह जानने के लिए अद्यतन के बाद "प्रभावित पंक्तियों की संख्या" की जांच करनी होगी कि यह "सफल" हुआ या नहीं।
लेकिन प्रभावित पंक्तियों की संख्या के बारे में पूछने से आप मूल समस्या पर लौट आते हैं:आपको MySQL बनाम HSQLDB में विभिन्न प्रश्नों का उपयोग करना होगा।
एचएसक्यूएलडीबी:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();