है, मैं एक तालिका में रिकॉर्ड डालने का सबसे अच्छा तरीका जानने की कोशिश कर रहा हूं, लेकिन केवल तभी आइटम मौजूद नहीं है। इस मामले में कुंजी एक NVARCHAR (400) क्षेत्र है। इस उदाहरण के लिए, ऑक्सफोर्ड अंग्रेजी शब्दकोश में शब्द का नाम दें/यहां अपना एफएवी शब्दकोश डालें। साथ ही, मुझे लगता है कि मुझे वर्ड फ़ील्ड को प्राथमिक कुंजी बनाने की आवश्यकता होगी। (तालिका में एक अद्वितीय पहचानकर्ता पीके भी होगा)।एसक्यूएल सर्वर - रिकॉर्ड कैसे सम्मिलित करें और सुनिश्चित करें कि यह अद्वितीय
तो .. मैं इन शब्दों है कि मैं मेज पर जोड़ने की जरूरत है ...
जैसे मिल सकता है।
- बिल्ली
- कुत्ता
- फू
- बार
- PewPew
- आदि ...
तो पारंपरिक रूप से, मैं निम्नलिखित (छद्म कोड) की कोशिश करेगा
SELECT WordID FROM Words WHERE Word = @Word
IF WordID IS NULL OR WordID <= 0
INSERT INTO Words VALUES (@Word)
यानी। यदि शब्द मौजूद नहीं है, तो उसे डालें।
अब .. जिस समस्या के बारे में मुझे चिंता है, वह है कि हमें हिट्स के बहुत सारे मिल रहे हैं .. तो क्या यह संभव है कि शब्द को चयन और INSERT के बीच में किसी अन्य प्रक्रिया से डाला जा सके .. जो होगा फिर एक बाधा त्रुटि फेंक दें? (यानी Race Condition)।
मैं तो सोचा था कि मैं निम्न करने के लिए सक्षम हो सकता है ...
INSERT INTO Words (Word)
SELECT @Word
WHERE NOT EXISTS (SELECT WordID FROM Words WHERE Word = @Word)
मूल रूप से, जब यह अस्तित्व में नहीं है एक शब्द डालते हैं।
खराब वाक्यविन्यास एक तरफ, मुझे यकीन नहीं है कि यह तालिका के नीचे ताले होने के कारण खराब या अच्छा है (यदि यह करता है) और वह उस टेबल पर प्रदर्शन करने वाला नहीं है जो इसे बड़े पैमाने पर पढ़ता है और बहुत सारे लिखते हैं ।
तो - आप एसक्यूएल गुरु क्या सोचते हैं/करते हैं?
मैं एक साधारण डालने और 'पकड़' की उम्मीद कर रहा था कि किसी भी त्रुटि को फेंक दिया जाए।
क्या EXISTS (चयन * से ...) और EXISTS (से चुनें 1 ...) के बीच कोई प्रदर्शन अंतर है? स्टार से बचने के लिए मैं हमेशा बाद वाले का उपयोग करता हूं - क्या वह फायदेमंद है या यह सब वही है? – Tomalak
मुझे संदेह है कि यह वही है, लेकिन आपको यह सुनिश्चित करने के लिए SQL सर्वर प्रोफाइलर में इसे आग लगाना होगा। –
मैं भी अपने चयन में * कभी नहीं *, लेकिन हमेशा वापसी फ़ील्ड/मान निर्दिष्ट करता हूं। –