2009-07-29 12 views
43

MySQL में, यदि आप ON DUPLICATE KEY UPDATE निर्दिष्ट करते हैं और एक पंक्ति डाली जाती है जो एक अद्वितीय सूचकांक या प्राथमिक कुंजी में डुप्लिकेट मान का कारण बनती है, तो पुरानी पंक्ति का अद्यतन किया जाता है।क्या एसक्यूएल सर्वर ऑफर MySQL के ऑन डिप्लिकेट की तरह कुछ अद्यतन

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; 

मैं नहीं मानता कि मैं T-SQL में की तरह का कुछ भी सामना करना पड़ा: उदाहरण के लिए, यदि स्तंभ एक अद्वितीय के रूप में घोषित और मान 1 होता है, निम्नलिखित दो बयान समान प्रभाव है। क्या SQL सर्वर MySQL के ऑन डिप्लिकेट कुंजी अपडेट से तुलनीय कुछ भी प्रदान करता है?

+0

आप इसे संग्रहीत प्रक्रिया के साथ अनुकरण कर सकते हैं। मेरे पास मेरे सिर के ऊपर से सटीक कोड नहीं है। –

+0

@ रॉबर्ट हार्वे - मैंने यह जांचकर ऑपरेशन के साथ हमेशा प्रदर्शन किया है कि पंक्ति मौजूद है या नहीं। यदि हां, तो एक अद्यतन करें और एक नई पंक्ति डालें। क्या आप यही सोच रहे थे? –

उत्तर

35

कोई डुप्लिकेट कुंजी अद्यतन बराबर नहीं है, लेकिन मर्ज और जब मिलान आप

Inserting, Updating, and Deleting Data by Using MERGE

+11

बस जागरूक रहें कि मेर्ज उच्च-समवर्ती सम्मिलित टक्कर से प्रतिरक्षा नहीं है। टकराव न करने के लिए आपको ** ** ** (अपडॉक, होल्डॉक) के साथ उपयोग करना होगा। कुछ अल्ट्रा-हाई-ट्रांजैक्शन-प्रति-सेकेंड सिस्टम एक अलग रणनीति का उपयोग करते हैं जहां ताले का उपयोग नहीं किया जाता है, लेकिन किसी भी त्रुटि फंस जाती है और फिर अपडेट में परिवर्तित हो जाती है। – ErikE

+3

इस उपयोगकर्ता नाम के लिए अधिक वोट पात्र हैं। – Pete

2

एसक्यूएल सर्वर 2008 इस सुविधा है के लिए काम कर सकते हैं, TSQL के हिस्से के रूप। मर्ज बयान यहाँ पर
दस्तावेज़ देखें - हालांकि वहाँ एक बुरा पर्दे के पीछे छिपा ट्रिगर हो जाएगा - http://msdn.microsoft.com/en-us/library/bb510625.aspx

+1

बस जागरूक रहें कि मेर्ज उच्च-समेकन सम्मिलन टकराव से प्रतिरक्षा नहीं है। टकराव न करने के लिए आपको मर्ज करने के लिए (अपडॉक, होल्डॉक) के साथ उपयोग करना होगा। कुछ अल्ट्रा-हाई-ट्रांजैक्शन-प्रति-सेकेंड सिस्टम एक अलग रणनीति का उपयोग करते हैं जहां ताले का उपयोग नहीं किया जाता है, लेकिन किसी भी त्रुटि फंस जाती है और फिर अपडेट में परिवर्तित हो जाती है। – ErikE

1

एसक्यूएल सर्वर 2000 से अबतक के बजाय ट्रिगर के की एक अवधारणा है, जो वांछित कार्यक्षमता को पूरा कर सकते है।

"सम्मिलित करें या अपडेट करें" अनुभाग को चेक करें

http://msdn.microsoft.com/en-us/library/aa224818(SQL.80).aspx

16

मुझे आश्चर्य है कि इस पृष्ठ पर जवाब में से कोई भी एक वास्तविक क्वेरी का एक उदाहरण निहित था, तो ये रहा:

डेटा सम्मिलित करके और फिर से निपटने का एक और अधिक जटिल उदाहरण नकल

MERGE 
INTO MyBigDB.dbo.METER_DATA WITH (HOLDLOCK) AS target 
USING (SELECT 
    77748 AS rtu_id 
    ,'12B096876' AS meter_id 
    ,56112 AS meter_reading 
    ,'20150602 00:20:11' AS local_time) AS source 
(rtu_id, meter_id, meter_reading, time_local) 
ON (target.rtu_id = source.rtu_id 
    AND target.time_local = source.time_local) 
WHEN MATCHED 
    THEN UPDATE 
     SET meter_id = '12B096876' 
     ,meter_reading = 56112 
WHEN NOT MATCHED 
    THEN INSERT (rtu_id, meter_id, meter_reading, time_local) 
     VALUES (77748, '12B096876', 56112, '20150602 00:20:11'); 
+4

आप महोदय ... एक जीवन बचतकर्ता हैं। , आईडी के रूप में पहचान: मैं वास्तव में माइक्रोसॉफ्ट दस्तावेजों नफरत ... वे हमेशा जो कि सबसे अधिक बार – Tschallacka

+0

' 'MyFancyTableName के साथ (HOLDLOCK) में विलय लक्ष्य \t \t \t का उपयोग \t \t \t (चयन के रूप में उपयोग किया जाता है को छोड़कर सभी उदाहरण देना : lastaccess lastaccess के रूप में स्रोत \t \t \t (आईडी, lastaccess के रूप में)) \t \t \t पर \t \t \t (target.id = स्रोत।आईडी) \t \t \t जब तत्कालीन मिलान अद्यतन सेट lastaccess =: \t \t \t lastaccess2 जब तत्कालीन मिलान नहीं डालें (आईडी, lastaccess) \t \t \t मूल्यों (: आईडी 2,: lastaccess3); ' 'मैं दोनों पोस्ट करने के लिए की जरूरत है 'USING' में चर का चयन करें या केवल 'id' पर्याप्त होगा? – Tschallacka

+0

मर्ज कमांड के संदर्भ के लिए धन्यवाद। मुझे इंगित करना चाहिए कि मिलान किए गए कथन में आप वही मानों का उपयोग कर रहे हैं जिन्हें आपने स्रोत के रूप में परिभाषित किया है। तो यदि आप अपडेट के बहुत सारे अपडेट करना चाहते हैं तो आपको इस तरह के स्रोत मान को एग्जिग करना चाहिए: –

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