बहुत से लोग आपको MERGE
. का उपयोग करने का सुझाव देंगे , लेकिन मैं आपको इसके खिलाफ सावधान करता हूं। डिफ़ॉल्ट रूप से, यह आपको एक से अधिक कथनों से अधिक समवर्ती और दौड़ की स्थितियों से नहीं बचाता है, लेकिन यह अन्य खतरों का परिचय देता है:
- SQL सर्वर के MERGE स्टेटमेंट के साथ सावधानी बरतें
- यदि आप मर्ज का उपयोग करना चाहते हैं तो क्या न करें
- एसक्यूएल सर्वर यूपीएसईआरटी पैटर्न और एंटीपैटर्न
यहां तक कि इस "सरल" सिंटैक्स के उपलब्ध होने के बावजूद, मैं अभी भी इस दृष्टिकोण को पसंद करता हूं (संक्षिप्तता के लिए छोड़े गए त्रुटि प्रबंधन):
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
UPDATE dbo.table SET ... WHERE PK = @PK;
IF @@ROWCOUNT = 0
BEGIN
INSERT dbo.table(PK, ...) SELECT @PK, ...;
END
COMMIT TRANSACTION;
इस पर अधिक जानकारी UPSERT
यहां पहुंचें:
- कृपया इस यूपीएसईआरटी विरोधी पैटर्न का उपयोग बंद करें
बहुत से लोग इस तरह से सुझाव देंगे:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
IF EXISTS (SELECT 1 FROM dbo.table WHERE PK = @PK)
BEGIN
UPDATE ...
END
ELSE
BEGIN
INSERT ...
END
COMMIT TRANSACTION;
लेकिन यह सब पूरा करता है यह सुनिश्चित कर रहा है कि अद्यतन की जाने वाली पंक्तियों का पता लगाने के लिए आपको तालिका को दो बार पढ़ने की आवश्यकता हो सकती है। पहले नमूने में, आपको केवल एक बार पंक्ति (पंक्तियों) का पता लगाने की आवश्यकता होगी। (दोनों ही मामलों में, यदि प्रारंभिक रीड से कोई पंक्तियाँ नहीं मिलती हैं, तो एक इंसर्ट होता है।)
अन्य इस तरह से सुझाव देंगे:
BEGIN TRY
INSERT ...
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 2627
UPDATE ...
END CATCH
हालाँकि, यह समस्याग्रस्त है यदि SQL सर्वर को अपवादों को पकड़ने के अलावा किसी अन्य कारण से नहीं, जिसे आप पहले स्थान पर रोक सकते थे, बहुत अधिक महंगा है, दुर्लभ परिदृश्य को छोड़कर जहां लगभग हर सम्मिलन विफल हो जाता है। मैं यहाँ उतना ही साबित करता हूँ:
- TRY/CATCH में प्रवेश करने से पहले संभावित बाधा उल्लंघनों की जांच करना
- विभिन्न त्रुटि प्रबंधन तकनीकों का प्रदर्शन प्रभाव
सुनिश्चित नहीं हैं कि आपको क्या लगता है कि एक ही कथन रखने से आपको क्या लाभ होता है; मुझे नहीं लगता कि आपको कुछ हासिल हुआ है। MERGE
एक ही कथन है लेकिन फिर भी इसे वास्तव में वैसे भी कई ऑपरेशन करने पड़ते हैं - भले ही यह आपको लगता है कि यह नहीं करता है।