Delete के बाद SQL Server में AutoIncrement को रीसेट करें


265

मैंने SQL सर्वर डेटाबेस में एक तालिका से कुछ रिकॉर्ड हटा दिए हैं। अब आईडी का 101 से 1200 तक जाना है। मैं फिर से रिकॉर्ड हटाना चाहता हूं, लेकिन मैं चाहता हूं कि आईडी वापस 102 पर जाए। क्या SQL सर्वर में ऐसा करने का कोई तरीका है?


46
कृपया "यह मत करो" मत कहो। मुझे इससे नफरत है जब मैं पूछता हूं कि कुछ कैसे करना है और मुझे जो भी मिलता है वह नहीं है। हां पहचान को रीसेट करने से विदेशी प्रमुख समस्याएं हो सकती हैं, लेकिन केवल अगर आप अपने डेटाबेस और कार्यक्रम के अनुसार नहीं जानते हैं। एक हटाए गए हटाए जाने के बाद पहचान को रीसेट करने के लिए बहुत अच्छे कारण हैं - उन्हें ऑडिटर कहा जाता है। लेखा परीक्षक अंतराल को देखने के लिए घृणा करते हैं इसलिए उन्हें भरें, इसे नियंत्रित तरीके से करें और सुनिश्चित करें कि विदेशी प्रमुख विरोधाभास बनाए हुए हैं।

6
@spyder, क्या आप जानते हैं कि यदि कोई रिकॉर्ड सम्मिलित नहीं किया गया है, तो क्या आप नष्ट हो जाएंगे? आप एक संकेत के साथ अंतराल से बच नहीं सकते हैं और यह कोशिश करना मूर्खता है। मैंने एक ऑडिट एजेंसी के लिए काम किया है और सक्षम ऑडिटर्स ने उन्हें यह समझाया हो सकता है। इसके अलावा यदि आपके पास उचित ऑडिट टेबल हैं, तो वे देख सकते हैं कि उन रिकॉर्डों का क्या हुआ। या अगर कानूनी कारणों के लिए कभी कोई अंतराल नहीं होना चाहिए (इस के कुछ मामले हैं), तो केवल एक अक्षम डेवलपर एक ऑटोइन्क्रिमेंट का उपयोग करेगा और ऑडिटर सही तरीके से परेशान हैं।
HLGEM

जवाबों:


454

1 पर शुरू करने के लिए mytable को फिर से शुरू करने के लिए निम्न आदेश जारी करें:

DBCC CHECKIDENT (mytable, RESEED, 0)

इसके बारे में पुस्तकें ऑन लाइन (BOL, SQL सहायता) में पढ़ें। इसके अलावा सावधान रहें कि आपके पास अपने द्वारा सेट किए गए बीज से अधिक रिकॉर्ड नहीं है।


4
... क्योंकि इन अभिलेखों के आईडी को खुशी से फिर से उपयोग किया जाएगा, जिससे खराब गड़बड़ होगी।
nalply

3
दरअसल, 1 में आईडी शुरू करने के लिए, आपको 0:DBCC CHECKIDENT (mytable, RESEED, 0)
रयान लूनी

7
"DBCC CHECKIDENT (table_name)" बीज को तालिका में उच्चतम पहचान के लिए सेट करता है, इससे आपको "सावधान" रहने की ज़रूरत नहीं है
user1027167

4
@ user1027167 नहीं, आपका जवाब मेरे काम नहीं आया। यह आंतरिक रूप से सहेजे गए उच्चतम आईडी पर वृद्धि करता रहा। मुझे अपने मामले में अगली आईडी के रूप में "19" प्राप्त करने के लिए स्पष्ट रूप से "RESEED, 18" का उपयोग करना था। इसके बिना "29" पर खुशी से वृद्धि होती रही।
मथिस कोहली

यदि पहचान मान कॉलम में अधिकतम मान से कम है, तो DBCC CHECKIDENT (table_name) केवल बीज को बदलें । इसलिए यदि पहचान मूल्य पहले से ही @MatthisKohli मामले की तरह बड़ा है, तो स्पष्ट रूप से कहा जाना चाहिए।
मार्थेन

82
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

यदि संख्या = 0 है तो अगली प्रविष्टि में ऑटो वेतन वृद्धि फ़ील्ड में मान 1 होगा

यदि संख्या = 101 है तो अगली प्रविष्टि में ऑटो वेतन वृद्धि क्षेत्र में मान 102 होगा


कुछ अतिरिक्त जानकारी ... आपके लिए उपयोगी हो सकती है उपरोक्त क्वेरी में

ऑटो वेतन वृद्धि देने से पहले number, आपको यह सुनिश्चित करना होगा कि आपके मौजूदा तालिका के ऑटो वेतन वृद्धि कॉलम में मान कम हैं number

किसी तालिका (तालिका 1) से एक स्तंभ (column_name) का अधिकतम मूल्य प्राप्त करने के लिए, आप निम्नलिखित क्वेरी का उपयोग कर सकते हैं

 SELECT MAX(column_name) FROM table1

37

अर्द्ध बेवकूफ-सबूत:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete


1
"DBCC CHECKIDENT (table_name)" वही करता है (दौड़ की स्थिति के बिना संभव है)
user1027167

2
@ user1027167 डॉक्स का कहना है कि 'यदि टेबल के लिए मौजूदा पहचान मूल्य पहचान कॉलम में संग्रहीत अधिकतम पहचान मूल्य से कम है'; डेटा हटाए जाने के बाद सफाई को कवर नहीं करता है (आईडी का उपयोग करना - अक्सर एक बुरा विचार है)। SQL 2008 पर सत्यापित
user423430

1
सबसे अच्छा व्यवस्थित और स्वचालित उत्तर। वाहवाही!
मेहदी खड़मलू

11

यदि आप MySQL का उपयोग कर रहे हैं, तो यह कोशिश करें:

ALTER TABLE tablename AUTO_INCREMENT = 1

3
यह MySQL के लिए एक उत्तर है। OP MSSQL के बारे में पूछ रहा है।
सुधार

प्रश्न MS SQL सर्वर के बारे में है
साहेर आह्वान

6

एक डेटाबेस में सभी तालिकाओं को हटा दें और उन्हें हटा दें।

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.

6

मैं यह समझ गया। आईटी इस:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)

4

पूर्ण स्कीमा योग्यता के साथ एक समान समस्या का सामना करने वालों के लिए स्वीकृत उत्तर के आधार पर:

( [MyDataBase].[MySchemaName].[MyTable]) ... एक त्रुटि के परिणामस्वरूप, आपको उस DB के संदर्भ में होना चाहिए

यही है, निम्नलिखित एक त्रुटि फेंक देगा:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

इसके बजाय एकल उद्धरण के साथ पूरी तरह से योग्य तालिका नाम संलग्न करें:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)

4

कई उत्तर कुछ इस तरह से कथन का उपयोग करने की सलाह देते हैं:

DBCC CHECKIDENT (mytable, RESEED, 0)

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

DBCC CHECKIDENT (mytable)

मान को रीसेट करने के लिए, लेकिन एक अन्य टिप्पणी ने सही ढंग से कहा कि यह केवल तालिका में पहले से ही अधिकतम मूल्य बढ़ाता है; यह मान को कम नहीं करेगा यदि यह पहले से ही तालिका में अधिकतम से अधिक है, जो ओपी करना चाहता था।

एक बेहतर समाधान इन विचारों को जोड़ती है। पहला CHECKIDENT मान को 0 पर सेट करता है, और दूसरा इसे तालिका में वर्तमान में उच्चतम मान पर रीसेट करता है, यदि तालिका में रिकॉर्ड हैं:

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

जैसा कि कई टिप्पणियों ने संकेत दिया है, सुनिश्चित करें कि हटाए गए रिकॉर्ड की ओर इशारा करते हुए अन्य तालिकाओं में कोई विदेशी कुंजी नहीं है। अन्यथा वे विदेशी कुंजियाँ आपके द्वारा बनाए गए अभिलेखों के बाद तालिका को फिर से शुरू करने पर इंगित करेंगी, जो लगभग निश्चित रूप से आपके दिमाग में नहीं थी।


4

मैं इस जवाब को जोड़ना चाहता हूं क्योंकि DBCC CHECKIDENTटेपर के लिए स्कीमा का उपयोग करने पर -approach उत्पाद समस्याओं का सामना करेगा। यह सुनिश्चित करने के लिए उपयोग करें:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

यदि आप ऑपरेशन की सफलता की जांच करना चाहते हैं, तो उपयोग करें

SELECT IDENT_CURRENT(@Table);

जो 0ऊपर दिए गए उदाहरण में आउटपुट होना चाहिए ।


1

आप सामान्य रूप से ऐसा नहीं करना चाहते हैं। Reseed डेटा अखंडता समस्याएं पैदा कर सकता है। यह वास्तव में केवल विकास प्रणालियों पर उपयोग के लिए है जहां आप सभी परीक्षण डेटा मिटा रहे हैं और शुरू कर रहे हैं। उत्पादन प्रणाली पर इसका उपयोग नहीं किया जाना चाहिए, यदि सभी संबंधित रिकॉर्ड हटाए नहीं गए हैं (प्रत्येक तालिका जो एक विदेशी कुंजी संबंध में होनी चाहिए!) नहीं है। आप ऐसा करने के लिए एक गड़बड़ बना सकते हैं और विशेष रूप से यदि आप इसका मतलब है कि हर डिलीट के बाद नियमित रूप से कर सकते हैं। यह आप के क्षेत्र के मूल्यों में अंतराल के बारे में चिंता करने के लिए एक बुरा विचार है।


6
मैं हर समय इसका उपयोग नहीं करूंगा और यह केवल एक परीक्षण DB पर था।
जुमबज

0

इस बारे में क्या?

ALTER TABLE `table_name`
  MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

यह ऑटो वेतन वृद्धि को 0 या जो भी संख्या आप चाहते हैं उसे बदलने का एक त्वरित और सरल तरीका है। मैंने एक डेटाबेस का निर्यात करके और कोड को स्वयं पढ़कर यह पता लगाया।

आप इसे एकल-पंक्ति समाधान बनाने के लिए इस तरह भी लिख सकते हैं:

ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
गुडबाय StackExchange
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.