2013-03-06 7 views
5

मैं एक मानक एसक्यूएल "UPSERT" कथन की तलाश में हूं। यदि मौजूद है तो सम्मिलित करने और अपडेट करने के लिए एक कॉल।एसक्यूएल मानक यूपीएसईआरटी कॉल

मैं एक कामकाजी, कुशल और पार मंच कॉल की तलाश में हूं।

मैंने MERGE, UPSERT, REPLACE, INSERT .. ON DUPLICATE UPDATE देखा है लेकिन कोई भी विवरण आवश्यकताओं को पूरा नहीं करता है।

बीटीडब्ल्यू मैं यूनिट्स के लिए MYSQL और HSQLDB का उपयोग करता हूं। मैं समझता हूं कि एचएसक्यूएलडीबी सीमित है और मुझे जो चाहिए उसे कवर नहीं किया जा सकता है, लेकिन मुझे इसके बिना भी एक मानक तरीका नहीं मिला। एक बयान है कि केवल MYSQL और HSQLDB अभी भी पर्याप्त होंगे।

मैं थोड़ी देर के लिए चारों ओर देख रहा हूं और जवाब नहीं मिला।

मेरे तालिका:

CREATE TABLE MY_TABLE (
    MY_KEY varchar(50) NOT NULL , 
    MY_VALUE varchar(50) DEFAULT NULL, 
    TIME_STAMP bigint NOT NULL, 
    PRIMARY KEY (MY_KEY) 
); 

किसी भी विचार?

Thanx;)

+0

'सम्मिलित करें .. पर डुप्लिकेट UPDATE'' mYSQL' में महत्वपूर्ण है। क्या आप कुछ रिकॉर्ड या शायद टेबल संरचना दिखा सकते हैं? –

+0

हाँ लेकिन यह केवल MYSQL में समर्थित है। एचएसक्यूएलडीबी और अन्य सभी इसका उपयोग नहीं करते हैं ... – BobTheBuilder

+0

एक एएनएसआई विलय (http://en.wikipedia.org/wiki/Merge_%28SQL%29) है, लेकिन यह सभी डीबीएमएस में लागू नहीं किया गया है। तो एक सार्वभौमिक आदेश के लिए कोई उम्मीद नहीं है। –

उत्तर

4

MySQL और HSQLDB दोनों द्वारा समर्थित एकमात्र समाधान उन पंक्तियों से पूछताछ करना है जिन्हें आप प्रतिस्थापित करना चाहते हैं, और सशर्त रूप से या तो INSERT या UPDATE। इसका मतलब है कि आपको आरडीबीएमएस कार्यान्वयन के बीच मतभेदों की भरपाई करने के लिए और अधिक आवेदन कोड लिखना होगा।

  1. स्टार्ट ट्रांसलेशन।
  2. अद्यतन ... अद्यतन के लिए।
  3. यदि चयन पंक्तियों को पाता है, तो अद्यतन करें।
  4. अन्य, INSERT।
  5. COMMIT।

MySQL ANSI SQL MERGE कथन का समर्थन नहीं करता है। यह डिप्लिकेट कुंजी अपडेट पर प्रतिस्थापन और INSERT का समर्थन करता है। उस पर अधिक के लिए "INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE" पर मेरा उत्तर देखें।


पुन: टिप्पणी करें: हां, एक और तरीका केवल INSERT को आज़माएं और देखें कि यह सफल होता है या नहीं। अन्यथा, एक अद्यतन करें। यदि आप INSERT का प्रयास करते हैं और यह डुप्लिकेट कुंजी हिट करता है, तो यह एक त्रुटि उत्पन्न करेगा, जो कुछ क्लाइंट इंटरफेस में अपवाद में बदल जाता है। MySQL में ऐसा करने का नुकसान यह है कि आईएनएसईआरटी विफल होने पर भी यह एक नई ऑटो-वृद्धि आईडी उत्पन्न करता है। तो आप अंतराल के साथ खत्म हो जाते हैं। मुझे पता है कि ऑटो-वृद्धि अनुक्रम में अंतराल सामान्य रूप से चिंता करने के लिए कुछ नहीं हैं, लेकिन मैंने पिछले साल एक ग्राहक की मदद की, जिसने इस प्रभाव के कारण सफल आवेषणों के बीच 1000-1500 के अंतर थे, और परिणाम यह था कि उन्होंने एक की सीमा को समाप्त कर दिया अपनी प्राथमिक कुंजी में INT।

जैसा कि @baraky कहते हैं, कोई इसके बजाय अद्यतन को पहले कोशिश कर सकता है, और यदि यह शून्य पंक्तियों को प्रभावित करता है, तो इसके बजाय INSERT करें। इस रणनीति पर मेरी टिप्पणी यह ​​है कि शून्य पंक्तियों को अद्यतन करना अपवाद नहीं है - अद्यतन के बाद आपको "प्रभावित पंक्तियों की संख्या" की जांच करनी होगी कि यह "सफल" है या नहीं।

लेकिन प्रभावित पंक्तियों की संख्या से पूछताछ आपको मूल समस्या पर लौटाती है: आपको MySQL बनाम HSQLDB में विभिन्न प्रश्नों का उपयोग करना होगा।

HSQLDB:

CALL DIAGNOSTICS(ROW_COUNT); 

MySQL:

SELECT ROW_COUNT(); 
+0

या INSERT निष्पादित करें, SQLException को पकड़ें और यदि यह एक ईमानदारी बाधा उल्लंघन है, तो एक अद्यतन – fredt

+0

निष्पादित करें कि वास्तव में (लगभग) जो मैं करने जा रहा हूं - मैं अपडेट कर रहा हूं, अपवाद पकड़ सकता हूं (क्योंकि अपडेट के लिए सामान्य मामला है मुझे) और विफल होने पर डालें। Thanx! – BobTheBuilder

3

एक भी आदेश में एक Upsert करने के लिए वाक्य रचना आरडीबीएमएस से भिन्न होता है।

MySQL में यह तो आप कई आदेशों का उपयोग करने की आवश्यकता होगी यह MERGE

है आप एक क्रॉस प्लेटफॉर्म समाधान चाहते हैं INSERT...ON DUPLICATE KEY UPDATE

है HSQLDB में,। सबसे पहले मौजूदा पंक्ति की जांच करें, फिर सशर्त रूप से उचित रूप से डालें या अपडेट करें।

+0

मैं एकाधिक कमांड का उपयोग नहीं करना चाहता हूं। कोई अन्य विचार कैसे परीक्षण और देव एक ही कोड चलाएंगे? – BobTheBuilder

+0

मैं अभी भी सशर्त कोड का उपयोग करके इसे करने की अनुशंसा करता हूं। यदि आप ऐसा नहीं करेंगे, तो अपने परीक्षण को मानकीकृत करने पर विचार करें और एक ही आरडी का उपयोग करने के लिए देव वातावरण बीएमएस। –

+0

@baraky: यदि आप एकाधिक डीबीएमएस का समर्थन करना चाहते हैं तो आप किसी भी कथन के साथ हर समस्या को हल करने में सक्षम नहीं होंगे जो सभी डीबीएमएस पर चलता है। डीबीएमएस विशिष्ट कथन रखने के लिए तैयार रहें। बाकी सब कुछ असफल होने जा रहा है। –

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