2010-11-26 3 views
11

SQL सर्वर 2008 एक्सप्रेस में पंक्तियों को हटाने के बाद पहचान फ़ील्ड मान का पुन: उपयोग करना संभव है? यहाँ एक उदाहरण है। मान लीजिए मेरे पास एक आईडी फ़ील्ड के साथ एक प्राथमिक कुंजी (पहचान) के रूप में एक टेबल है। यदि मैं पांच पंक्तियां जोड़ता हूं, तो मेरे पास इन 5 आईडी होंगे: 1, 2, 3, 4, 5. अगर मैं इन पंक्तियों को हटाना चाहता था, और फिर पांच और जोड़ना, तो नई पंक्तियों में आईडी: 6, 7, 8, 9, 10. क्या यह 1 बार फिर से शुरू करना संभव है?पंक्तियों को हटाने के बाद पहचान मान का पुन: उपयोग करें

क्या मुझे इसे पूरा करने के लिए किसी अन्य तालिका से डेटा हटाना होगा? आपकी सहायता के लिए धन्यवाद.

+0

क्या आपका मतलब पहचान क्षेत्र है? लगभग सभी मेरी टेबल के लिए प्राथमिक कुंजी आईडी है और यह आमतौर पर एक पहचान फ़ील्ड – Murph

+0

है (हालांकि, विशेष रूप से नहीं) हाँ, मेरा मतलब एक पहचान क्षेत्र था। – Jeremy

+3

सिर्फ इसलिए कि ऐसा करने का कोई तरीका नहीं है इसका मतलब यह नहीं है कि आपको चाहिए। – JeffO

उत्तर

20

आप पहचान मान सेट करने के लिए निम्न का उपयोग कर सकते हैं। यह हाइलाइट करना शुरू करना चाहिए कि यह एक बुरा विचार क्यों है ...

डेटाबेस अनुक्रमिक मानों की परवाह नहीं करता है - यह केवल प्रस्तुति के लिए है।

+0

यदि आप आईडी 10 के साथ एक पंक्ति डालना चाहते हैं तो आपको आईडी 9 के साथ शोध करना चाहिए। वृद्धि का मानना ​​है 1. – Gomibushi

+1

आप अपने वर्तमान बीज मूल्य को जानने के लिए इसका भी उपयोग कर सकते हैं: current_identrent ('table_name') को वर्तमान_ दशमलव के रूप में चुनें – Nathan

5

identity फ़ील्ड डिफ़ॉल्ट रूप से पुराने मानों का पुन: उपयोग नहीं करते हैं। आप उन्हें dbcc checkident के साथ संशोधित कर सकते हैं, लेकिन यह सुझाव नहीं दिया जाता है क्योंकि यदि आप तालिका में मौजूद किसी मान के नीचे शोध करते हैं तो आपको महत्वपूर्ण उल्लंघन मिलेंगे। आम तौर पर, आपको परवाह नहीं करना चाहिए कि पीके मूल्य क्या हैं। तथ्य यह है कि वे संगत नहीं हैं कुछ भी चोट नहीं पहुंचाता है।

DBCC CHECKIDENT (orders, RESEED, 999) 

इसका मतलब है कि आप बयान हर DELETE के आधार पर चलाना होगा:

+1

तथ्य यह है कि वे लगातार नहीं हैं वास्तव में कुछ चोट पहुंचाते हैं, क्योंकि हटाए गए मानों का पुन: उपयोग नहीं किया जाता है। चूंकि 32-बिट पहचान कॉलम अधिकतम 2^32 (या नकारात्मक मूल्यों को छोड़कर 2^31) तक सीमित होगा, जिसके बाद आवेषण ओवरफ़्लो त्रुटि का कारण बनता है। यह अनिवार्य रूप से संसाधन रिसाव का एक प्रकार है। मैंने कुछ गणना की और निर्धारित किया कि 32-बिट पहचान कॉलम भविष्य-सबूत नहीं है, और यहां तक ​​कि 64-बिट कॉलम भी पर्याप्त नहीं हो सकता है, क्योंकि कंप्यूटर केवल मेरे डेस्कटॉप से ​​1000 या उससे अधिक तेज़ मूल्यों को खा सकता है एक साल से कम। तो 128-बिट GUIDs एफटीडब्ल्यू। – Triynko

+1

एक पहचान के रूप में पहचान कॉलम आपको 2^63 - 1 पंक्तियां प्राप्त करता है। वह 9 क्विंटिल पंक्तियां है। यहां तक ​​कि प्रति दिन एक ट्रिलियन आवेषण भी, यह अभी भी आपको 25,000 साल तक टिकेगा। – Aaroninus

9

आप को हटाने के बाद पहचान रीसेट करना चाहते हैं सभी पंक्तियों तो इन

--instead of delete, resets identity value 
TRUNCATE TABLE orders 

--or if TRUNCATE fails because of FKs, use this after DELETE 
DBCC CHECKIDENT (orders, RESEED, 1) 

से एक कार्य करें अन्यथा, आंतरिक मूल्य है कि क्या अंतराल या नहीं कोई फर्क नहीं करना चाहिए।

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