मैंने SQL सर्वर डेटाबेस में एक तालिका से कुछ रिकॉर्ड हटा दिए हैं। अब आईडी का 101 से 1200 तक जाना है। मैं फिर से रिकॉर्ड हटाना चाहता हूं, लेकिन मैं चाहता हूं कि आईडी वापस 102 पर जाए। क्या SQL सर्वर में ऐसा करने का कोई तरीका है?
मैंने SQL सर्वर डेटाबेस में एक तालिका से कुछ रिकॉर्ड हटा दिए हैं। अब आईडी का 101 से 1200 तक जाना है। मैं फिर से रिकॉर्ड हटाना चाहता हूं, लेकिन मैं चाहता हूं कि आईडी वापस 102 पर जाए। क्या SQL सर्वर में ऐसा करने का कोई तरीका है?
जवाबों:
1 पर शुरू करने के लिए mytable को फिर से शुरू करने के लिए निम्न आदेश जारी करें:
DBCC CHECKIDENT (mytable, RESEED, 0)
इसके बारे में पुस्तकें ऑन लाइन (BOL, SQL सहायता) में पढ़ें। इसके अलावा सावधान रहें कि आपके पास अपने द्वारा सेट किए गए बीज से अधिक रिकॉर्ड नहीं है।
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
यदि संख्या = 0 है तो अगली प्रविष्टि में ऑटो वेतन वृद्धि फ़ील्ड में मान 1 होगा
यदि संख्या = 101 है तो अगली प्रविष्टि में ऑटो वेतन वृद्धि क्षेत्र में मान 102 होगा
कुछ अतिरिक्त जानकारी ... आपके लिए उपयोगी हो सकती है उपरोक्त क्वेरी में
ऑटो वेतन वृद्धि देने से पहले number
, आपको यह सुनिश्चित करना होगा कि आपके मौजूदा तालिका के ऑटो वेतन वृद्धि कॉलम में मान कम हैं number
।
किसी तालिका (तालिका 1) से एक स्तंभ (column_name) का अधिकतम मूल्य प्राप्त करने के लिए, आप निम्नलिखित क्वेरी का उपयोग कर सकते हैं
SELECT MAX(column_name) FROM table1
अर्द्ध बेवकूफ-सबूत:
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
यदि आप MySQL का उपयोग कर रहे हैं, तो यह कोशिश करें:
ALTER TABLE tablename AUTO_INCREMENT = 1
एक डेटाबेस में सभी तालिकाओं को हटा दें और उन्हें हटा दें।
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.
पूर्ण स्कीमा योग्यता के साथ एक समान समस्या का सामना करने वालों के लिए स्वीकृत उत्तर के आधार पर:
( [MyDataBase].[MySchemaName].[MyTable]
) ... एक त्रुटि के परिणामस्वरूप, आपको उस DB के संदर्भ में होना चाहिए
यही है, निम्नलिखित एक त्रुटि फेंक देगा:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
इसके बजाय एकल उद्धरण के साथ पूरी तरह से योग्य तालिका नाम संलग्न करें:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
कई उत्तर कुछ इस तरह से कथन का उपयोग करने की सलाह देते हैं:
DBCC CHECKIDENT (mytable, RESEED, 0)
लेकिन ओपी ने कहा कि "कुछ रिकॉर्ड हटा दिए गए", जो कि उन सभी को नहीं हो सकता है, इसलिए 0 का मान हमेशा सही नहीं होता है। एक अन्य जवाब में स्वचालित रूप से अधिकतम वर्तमान मूल्य खोजने और उस एक को फिर से शुरू करने का सुझाव दिया गया था, लेकिन यह मुसीबत में चला जाता है अगर तालिका में कोई रिकॉर्ड नहीं है, और इस प्रकार अधिकतम () NULL वापस आ जाएगा। एक टिप्पणी का उपयोग करके सुझाव दिया
DBCC CHECKIDENT (mytable)
मान को रीसेट करने के लिए, लेकिन एक अन्य टिप्पणी ने सही ढंग से कहा कि यह केवल तालिका में पहले से ही अधिकतम मूल्य बढ़ाता है; यह मान को कम नहीं करेगा यदि यह पहले से ही तालिका में अधिकतम से अधिक है, जो ओपी करना चाहता था।
एक बेहतर समाधान इन विचारों को जोड़ती है। पहला CHECKIDENT मान को 0 पर सेट करता है, और दूसरा इसे तालिका में वर्तमान में उच्चतम मान पर रीसेट करता है, यदि तालिका में रिकॉर्ड हैं:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
जैसा कि कई टिप्पणियों ने संकेत दिया है, सुनिश्चित करें कि हटाए गए रिकॉर्ड की ओर इशारा करते हुए अन्य तालिकाओं में कोई विदेशी कुंजी नहीं है। अन्यथा वे विदेशी कुंजियाँ आपके द्वारा बनाए गए अभिलेखों के बाद तालिका को फिर से शुरू करने पर इंगित करेंगी, जो लगभग निश्चित रूप से आपके दिमाग में नहीं थी।
मैं इस जवाब को जोड़ना चाहता हूं क्योंकि DBCC CHECKIDENT
टेपर के लिए स्कीमा का उपयोग करने पर -approach उत्पाद समस्याओं का सामना करेगा। यह सुनिश्चित करने के लिए उपयोग करें:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
यदि आप ऑपरेशन की सफलता की जांच करना चाहते हैं, तो उपयोग करें
SELECT IDENT_CURRENT(@Table);
जो 0
ऊपर दिए गए उदाहरण में आउटपुट होना चाहिए ।
आप सामान्य रूप से ऐसा नहीं करना चाहते हैं। Reseed डेटा अखंडता समस्याएं पैदा कर सकता है। यह वास्तव में केवल विकास प्रणालियों पर उपयोग के लिए है जहां आप सभी परीक्षण डेटा मिटा रहे हैं और शुरू कर रहे हैं। उत्पादन प्रणाली पर इसका उपयोग नहीं किया जाना चाहिए, यदि सभी संबंधित रिकॉर्ड हटाए नहीं गए हैं (प्रत्येक तालिका जो एक विदेशी कुंजी संबंध में होनी चाहिए!) नहीं है। आप ऐसा करने के लिए एक गड़बड़ बना सकते हैं और विशेष रूप से यदि आप इसका मतलब है कि हर डिलीट के बाद नियमित रूप से कर सकते हैं। यह आप के क्षेत्र के मूल्यों में अंतराल के बारे में चिंता करने के लिए एक बुरा विचार है।
इस बारे में क्या?
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;