2013-02-11 24 views
12

प्रदान नहीं किया गया है, तो मैं तालिका में प्रत्येक रिकॉर्ड के लिए GUID के लिए कॉलम रखने के लिए अपना डेटाबेस अपडेट कर रहा हूं।SQL सर्वर में नया GUID जेनरेट करें यदि कोई

यह तालिका कई अलग-अलग स्रोतों द्वारा पॉप्युलेट की गई है और उनमें से कुछ नए रिकॉर्ड के लिए GUID प्रदान नहीं करेंगे।

डीबी पक्ष पर केवल इस कॉलम को एक नए() के साथ कैसे पॉप्युलेट कर सकता है यदि नए रिकॉर्ड के लिए कोई मूल्य पास नहीं हुआ हो?

+2

कॉलम के लिए डिफ़ॉल्ट 'NEWID() 'के रूप में सेट करें? – Kermit

+0

इसलिए यदि कोई मान मौजूद नहीं है, तो NEWID() इसे पॉप्युलेट करेगा और इसे ओवरराइट नहीं करेगा? – Slee

उत्तर

23

क्या मुझे दोहराना नहीं है NEWID() का एक निर्णायक कॉलम न करें। यदि आप GUID करते हैं तो आपको पूरी तरह से यादृच्छिक होगा और यदि आपके पास इस कॉलम पर अनुक्रमण का कोई भी प्रकार है तो यह बेकार होगा। यदि आप ऐसा करने जा रहे हैं तो आप कॉलम डिफ़ॉल्ट को NEWSEQUENTIALID ()

किम्बर्ली ट्रिप के पास इस विषय पर Great Article और Great Article है।

एक डिफ़ॉल्ट के रूप में NEWSEQUENTIALID () लागू करने के लिए:

CREATE TABLE foo 
(unq_id UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), 
cola varchar(10)); 

Full SQL Fiddle example.

+1

हां, यह बेहतर है, लेकिन ध्यान दें कि यह उस मामले में मदद नहीं करेगा जहां अधिकांश GUID ऐप से आते हैं (और कौन जानता है कि वे कैसे उत्पन्न होते हैं)। –

+0

इस तालिका पर कोई अनुक्रमण नहीं है और अगर यह अनुक्रमिक है तो मुझे कोई परवाह नहीं है। आखिर में मैं हमेशा GUID मान की आपूर्ति कर रहा हूं और यह एक अलग सिस्टम से आ सकता है जहां यह एक अद्वितीय मूल्य है और हमेशा एक GUID नहीं है, इसलिए मेरे पास यह क्षेत्र थोड़ा अधिक लचीला बनाने के लिए एनवीएआरएआरएआर के रूप में है। – Slee

+3

कहने के लिए कि सूचकांक बेकार है काफी खिंचाव है। एक इंडेक्स जिसमें विखंडन के मुद्दे हैं, अभी भी एक आवश्यक इंडेक्स होने के लिए * बेहतर नहीं है। लेकिन अभी भी वैध समाधान के लिए +1 है। –

5

आप कॉलम के लिए डिफ़ॉल्ट मान NEWID() पर सेट कर सकते हैं। फिर एक GUID बनाया जाएगा और केवल तभी असाइन किया जाएगा जब कोई पहले से नहीं रहा हो।