2011-12-23 8 views
5

मेरे पास मेरे प्रोजेक्ट में एक चीज है जहां मुझे भौतिक रूप से रिकॉर्ड डाले बिना फ़ील्ड में अगली प्राथमिक कुंजी प्रदर्शित करने की आवश्यकता है?एसक्यूएल सर्वर में रिकॉर्ड डाले बिना टेबल के अगले प्राथमिक कुंजी मान को कैसे जानें?

मैं रिकॉर्ड डालने के बिना प्राथमिक कुंजी के अगले मूल्य को कैसे जान सकता हूं?

यानी प्राथमिक कुंजी के रूप में आईडी कॉलम के साथ 10 रिकॉर्ड हैं। अब मैंने 10 वां रिकॉर्ड हटा दिया है, इसलिए अगला मान 11 होगा।

मैं तालिका में भौतिक रूप से रिकॉर्ड डाले बिना अगली प्राथमिक कुंजी (मेरे मामले में 11) के मूल्य को जानना चाहता हूं।

संक्षेप में, प्राथमिक कुंजी का भविष्य अगला मूल्य।

मैं इसे कैसे प्राप्त कर सकता हूं ??

कृपया समाधान प्रदान करें।

+0

मुझे समाधान मिला। –

+0

देखें कि यह भौतिक रिकॉर्ड डाले बिना अगला मूल्य प्राप्त करने के लिए सकारात्मक है। –

+0

जो ** नहीं ** एक वैध समाधान है। आप ** वर्तमान ** मूल्य से पूछ सकते हैं - लेकिन यह ** कोई गारंटी नहीं देता ** ** अगला मूल्य क्या होगा ..... –

उत्तर

8

संपादित करें (बहुत महत्वपूर्ण)

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

जैसा कि बताया गया है, यदि आपका कार्यान्वयन ऐसी धारणा पर आधारित है, तो आपने कुछ डिज़ाइन त्रुटियां की हैं, और इस समाधान को पहली प्राथमिकता के रूप में पुन: कार्य करना चाहिए।

IDENT_CURRENT (Transact-SQL)

से एक निर्धारित तालिका या देखने के लिए उत्पन्न पिछले पहचान मान देता है। उत्पन्न अंतिम पहचान मान किसी भी सत्र और दायरे के लिए हो सकता है।

निम्न उदाहरण

CREATE TABLE #Table (
     ID INT IDENTITY(1,1), 
     Val INT 
) 

INSERT INTO #Table SELECT 1 
INSERT INTO #Table SELECT 2 
INSERT INTO #Table SELECT 3 

SELECT * FROM #Table 

DELETE FROM #Table WHERE ID >= 2 

SELECT * FROM #Table 

SELECT IDENT_CURRENT('#Table') 

DROP TABLE #Table 
+0

है जो आपको ** वर्तमान ** मान दे सकता है - लेकिन यह * * कोई गारंटी नहीं ** ** अगला ** मूल्य क्या होगा .... –

+0

@marc_s यह आपको उस तालिका के लिए उपयोग की जाने वाली अंतिम पहचान देता है, इसलिए अगला पहचान अंतराल पर निर्भर करेगा, जो आम तौर पर 1 है , तो अगला होगा कि +1, मुझे लगता है? –

+1

सबसे पहले, एक पहचान हमेशा 1 से बढ़ी नहीं जाती है - यह कुछ और हो सकती है। यहां तक ​​कि यदि आप इसे ध्यान में रखते हैं - वहां ** कोई गारंटी नहीं है ** आपको वह मान मिलेगा - एक अन्य लेनदेन IDENT_CURRENT से पूछे जाने वाले समय के बीच एक पंक्ति डाल सकता है, और जब तक आप पंक्ति पंक्ति डालते हैं। समय से पहले अगले पहचान मूल्य को जानने के लिए ** ** कोई विश्वसनीय तरीका नहीं है **। –

3

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

तो भविष्य की पहचान कुंजी चाहते हैं तो आपका तर्क क्या है?

1
एसक्यूएल सर्वर (2008 R2) के वर्तमान संस्करण है, और IDENTITY प्रणाली का उपयोग कर के साथ

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

एसक्यूएल सर्वर 2012 ("डेनलि") SEQUENCES जो लगभग IDENTITY कॉलम के समान है होगा - लेकिन स्टैंड-अलोन, और दृश्यों के साथ, आप अगले मूल्य के लिए पूछ सकते हैं (और फिर इसका इस्तेमाल)

दृश्यों के बारे में और अधिक पढ़ें:

0

चयन आईडी ENT_CURRENT ('उन')

चयन IDENT_CURRENT ('तालिका नाम')

+0

यह आपको ** वर्तमान ** मान देता है - लेकिन यह आपको यह सुनिश्चित करने के लिए बताता है कि ** अगला VALUE ** क्या होगा ...... –

+0

नहीं, हमें इसे +1 से प्राप्त करने की आवश्यकता होगी, यह निश्चित रूप से –

+0

निश्चित रूप से, आप सही हैं जब एक बड़ा आवेदन है और कई क्लाइंट ब्राउज़र से सम्मिलन कर रहा है, उल्लेख करने के लिए खेद है, लेकिन मेरे पास बहुत छोटा –

0

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

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