पहचान मूल्य रीसेट करें


16

मेरे पास IDENTITY कॉलम वाली एक तालिका है। विकास करते समय मैं समय-समय पर पंक्तियों को हटाता हूं और उन्हें फिर से जोड़ता हूं। लेकिन IDENTITY मान हमेशा बढ़ता रहा और 1 से शुरू नहीं हुआ जब मैंने उन्हें फिर से जोड़ा। अब मेरी आईडी 68 -> 92 से जाती है और इससे मेरा कोड क्रैश हो जाता है।

मैं पहचान मूल्य कैसे रीसेट करूं?


मैं अपना कोड लापता पहचान मूल्यों के लिए अधिक लचीला बनाऊंगा। एक पहचान स्तंभ सन्निहित नंबरिंग की गारंटी नहीं है, और होगा अंततः हो
Trubs

जवाबों:


29

आप द्वारा पहचान मान को रीसेट कर सकते हैं

DBCC CHECKIDENT('tableName', RESEED, 0)

तो अगली बार जब आप TableName में सम्मिलित करते हैं, तो सम्मिलित किया गया पहचान मूल्य 1 होगा।

जब आप तालिका से पंक्तियों को हटाते हैं, तो यह पहचान मान को रीसेट नहीं करेगा, लेकिन यह इसे बढ़ाता रहेगा। जैसा आपके मामले में हुआ वैसा ही हुआ।

अब जब आप काट-छांट की मेज, यह तालिका के अपने मूल बीज मूल्य को पहचान मूल्य रीसेट कर देगा।

देखें: SQL SERVER - DELETE, TRUNCATE और सुरक्षित पहचान एक विस्तृत उदाहरण के लिए और Truncate और Delete के बीच अंतर की कुछ अच्छी व्याख्या


22

परिजनों ने आपको दिखाया है कि आप कैसे पहचान मूल्य को रीसेट कर सकते हैं, लेकिन एक विकास के माहौल के बाहर जब आप वास्तव में सभी डेटा निकाल रहे हैं , तो आपको ऐसा करने की आवश्यकता क्यों है?

मुझे आशा है कि जब आप उत्पादन में होते हैं, तो आपके पास पहचान मूल्यों का एक क्रम बनाए रखने का इरादा नहीं होता है। और मुझे आशा है कि आप वास्तव में IDENTITY मूल्यों को हार्ड-कोड करने के लिए अपना कोड नहीं लिख रहे हैं। यदि ये सार्थक ID मान हैं तो आपको IDENTITY गुण का उपयोग करना बंद कर देना चाहिए।

कुछ चीजें हैं जो इसे होने से रोकेंगी:

  • यदि किसी लेन-देन के दौरान एक पहचान मूल्य असाइन किया गया है, और लेन-देन वापस ले लिया गया है, तो मान "वापस नहीं दिया गया" है और अगला मूल्य कभी भी उपयोग नहीं किया जाने वाला + 1 होगा।
  • यदि बाद में कोई पंक्ति हटा दी जाती है, तो अंतराल में भरने के लिए पहचान कभी वापस नहीं आती है।
  • SQL Server 2012 में एक सक्रिय बग है जिसे तब तक ठीक नहीं किया जाएगा जब तक कि SQL Server 2014 को ठीक नहीं किया जाएगा (जब तक कि आप एक अनजाने और बहुत महंगे ट्रेस ध्वज का उपयोग नहीं करते हैं) जिससे आपके IDENTITY कॉलम से 1000 मान तक का त्याग करना प्रतीत होगा । कनेक्ट पर बग बताता है कि यह उपलब्धता समूहों से जुड़े फेलओवर की घटनाओं तक सीमित है लेकिन मैं आपको आश्वस्त कर सकता हूं कि बग इससे कहीं अधिक व्यापक है।

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

एक तरफ के रूप में, प्राथमिक कुंजी और पहचान एक ही बात नहीं है। एक पहचान स्तंभ एक प्राथमिक कुंजी नहीं है जब तक कि आप स्पष्ट रूप से इसे इस तरह परिभाषित नहीं करते हैं, और आपके पास निश्चित रूप से एक प्राथमिक कुंजी हो सकती है जो पहचान स्तंभ नहीं है।


-4

यदि आपको केवल पिछली पंक्तियों को समाप्त करने की आवश्यकता है, जिन्होंने किसी पहचान क्षेत्र के वृद्धिशील मूल्य का पालन नहीं किया है, तो एक आसान और सुरक्षित तरीका है:

  1. सबसे पहले पिछले रिकॉर्ड को हटाएं, जो 'जंप' कर चुका है
  2. अपने पहचान क्षेत्र के डेटा प्रकार को बदलें (इंट से लेकर बिगिंट या इसके विपरीत)
  3. तालिका सहेजें
  4. एक नया रिकॉर्ड जोड़ें, और जाँचें कि यह उच्चतम मान + 1 की संख्या प्रदान करता है
  5. अपनी आवश्यकताओं के लिए सुविधाजनक के रूप में अपने पहचान क्षेत्र के डेटा प्रकार को बदलें

और आप कर रहे हैं


3
SQL सर्वर के लिए "तालिका सहेजें" सार्थक कथन नहीं है। डेटा प्रकार बदलना 100 से कम पंक्तियों के साथ तुच्छ हो सकता है लेकिन बड़ी तालिकाओं के लिए बहुत महंगा साबित हो सकता है ।
माइकल ग्रीन

2
मुझे लगता है आप SSMS में मतलब है। यह एक नई तालिका बनाएगा, इसमें सभी पंक्तियों को कॉपी करेगा, पुरानी तालिका को ड्रॉप करेगा और नए का नाम बदलेगा। और डेटाटाइप को वापस टॉगल करने के लिए आपको दो बार ऐसा करने की आवश्यकता है। यह एक अखरोट को तोड़ने के लिए स्लेजहैमर का उपयोग कर रहा है।
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.