दिलचस्प पोस्ट
हेक्सागोन का उत्तरदायी ग्रिड सी में "कॉलबैक" क्या है और उनका कार्यान्वयन कैसे किया जाता है? कुकी सेट करें और जावास्क्रिप्ट के साथ कुकी प्राप्त करें आईफ़ोन: एक स्थानीय सूचना के माध्यम से एप्लिकेशन बैज को बढ़ाना स्विफ्ट में आवश्यक तर्क लेबल कब हैं? Asp.net में डिफ़ॉल्ट पृष्ठ सेट करें जावास्क्रिप्ट में तेजी से स्थिर सॉर्टिंग एल्गोरिथ्म कार्यान्वयन गतिशील छवियां जोड़ें वेबपैक पर प्रतिक्रिया दें क्यों easy_install पर पीईपी का उपयोग करें? VB.NET बराबर विकल्प के साथ सी # 'गतिशील' सख्त पर एंड्रॉइड कैमरा के NV21 प्रारूप से काले और सफेद छवि निकालें MVC कस्टम रूटिंग में एकाधिक स्तर क्या किसी को भी समझाया जा सकता है JSONP क्या है, सामान्य शब्दों में? क्या हैं। ए और .so फ़ाइलें? एक स्प्रिंग बीन में मोकीटीओ को इंजेक्शन लगाने

केवल एक पंक्ति डालना यदि वह पहले से ही नहीं है

मैंने इसे प्राप्त करने के लिए हमेशा निम्न के जैसा कुछ इस्तेमाल किया था:

INSERT INTO TheTable SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WHERE PrimaryKey = @primaryKey) 

… लेकिन एक बार लोड के तहत, एक प्राथमिक कुंजी उल्लंघन हुआ। यह एकमात्र कथन है जो इस तालिका में सम्मिलित होता है। तो क्या इसका मतलब यह है कि उपरोक्त विवरण परमाणु नहीं है?

समस्या यह है कि इच्छाशक्ति पर पुनर्निर्माण करना लगभग असंभव है

शायद मैं इसे नीचे की तरह कुछ करने के लिए बदल सकता है:

 INSERT INTO TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) WHERE PrimaryKey = @primaryKey) 

हालांकि, शायद मैं गलत ताले का उपयोग कर रहा हूं या बहुत ज्यादा लॉकिंग या कुछ का उपयोग कर रहा हूं

मैंने stackoverflow.com पर अन्य प्रश्न देखा है जहां जवाब "यदि (SELECT COUNT (*) … INSERT" आदि का सुझाव दे रहे हैं, लेकिन मैं हमेशा (शायद गलत) धारणा के तहत होता था कि एक एकल SQL कथन परमाणु होगा

क्या किसी के पास कोई विचार है?

वेब के समाधान से एकत्रित समाधान "केवल एक पंक्ति डालना यदि वह पहले से ही नहीं है"

"जेएफडीआई" पैटर्न के बारे में क्या?

 BEGIN TRY INSERT etc END TRY BEGIN CATCH IF ERROR_NUMBER() <> 2627 RAISERROR etc END CATCH 

गंभीरता से, यह तेज और ताला के बिना सबसे अधिक समवर्ती है, खासकर उच्च मात्रा में। क्या होगा अगर UPDLOCK बढ़ता है और पूरी मेज लॉक हो जाती है?

सबक 4 पढ़ें

मैंने कहा कि हॉलॉक जो मूलतः मौजूद नहीं था कृपया इस संकेत के बिना संस्करण को अनदेखा करें

जहाँ तक मुझे चिंता है, यह पर्याप्त होना चाहिए:

 INSERT INTO TheTable SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT 0 FROM TheTable WITH (UPDLOCK, HOLDLOCK) WHERE PrimaryKey = @primaryKey) 

इसके अलावा, यदि आप वास्तव में एक पंक्ति अपडेट करना चाहते हैं और यदि वह मौजूद नहीं है, तो आपको यह प्रश्न उपयोगी लग सकता है

आप मेर्ज का उपयोग कर सकते हैं:

 MERGE INTO Target USING (VALUES (@primaryKey, @value1, @value2)) Source (key, value1, value2) ON Target.key = Source.key WHEN MATCHED THEN UPDATE SET value1 = Source.value1, value2 = Source.value2 WHEN NOT MATCHED BY TARGET THEN INSERT (Name, ReasonType) VALUES (@primaryKey, @value1, @value2) 

मुझे नहीं पता कि यह "आधिकारिक" तरीका है, लेकिन आप INSERT कोशिश कर सकते हैं, और यदि यह असफल हो तो UPDATE वापस आ जाए।

क्या आप एक लेनदेन में बयान लपेट सकते हैं? इससे पहले जब तक पहला लेनदेन नहीं किया जाता है तब तक सम्मिलित करने का प्रयास करने से किसी अन्य बयान को रोकना चाहिए।

सबसे पहले, समुदाय के लिए उनके योगदान के लिए हमारे आदमी @ जीबीएन के लिए बहुत बड़ा चिल्लाओ यह भी समझाने की शुरूआत नहीं की जा सकती कि मैं अपनी सलाह के अनुसार खुद को कितनी बार मिल सकता हूं

वैसे भी, पर्याप्त fanboy- आईएनजी

अपने जवाब में थोड़े जोड़ने के लिए, शायद "इसे बढ़ाएं" उन लोगों के लिए, मेरे जैसे, <> 2627 परिदृश्य में क्या करना है (और कोई भी रिक्त CATCH एक विकल्प नहीं है) के साथ अस्थिर महसूस कर रहा है मुझे टेक्केट से इस छोटे से सोने का डला मिला।

  BEGIN TRY INSERT etc END TRY BEGIN CATCH IF ERROR_NUMBER() <> 2627 BEGIN DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); RAISERROR ( @ErrorMessage, @ErrorSeverity, @ErrorState ); END END CATCH 

मैंने एक अलग तरीके का उपयोग करते हुए अतीत में एक समान कार्य किया है। सबसे पहले, मैं प्राथमिक कुंजी को पकड़ने के लिए एक चर घोषित करता हूं। तब मैं उस वेरिएबल को एक चुनिंदा बयान के आउटपुट के साथ पॉप्यूलेट करता हूं जो उन मानों के साथ एक रिकॉर्ड की तलाश करता है। फिर मैं करता हूं और IF स्टेटमेंट अगर प्राथमिक कुंजी रिक्त है, तो सम्मिलित करें, अन्य, कुछ त्रुटि कोड लौटाएं।

  DECLARE @existing varchar(10) SET @existing = (SELECT primaryKey FROM TABLE WHERE param1field = @param1 AND param2field = @param2) IF @existing is not null BEGIN INSERT INTO Table(param1Field, param2Field) VALUES(param1, param2) END ELSE Return 0 END