MySQL में AUTO_INCREMENT कैसे रीसेट करें?


1245

मैं किसी फ़ील्ड को कैसे रीसेट कर सकता हूं AUTO_INCREMENT?
मैं चाहता हूं कि इसकी गिनती 1फिर से शुरू हो।



80
आप शायद तालिका को भी खाली करना चाहेंगे:TRUNCATE TABLE yourTableName;
कोणार्क


3
हां, इस मामले में ट्रंकट टेबल सबसे अच्छी है। यह भी ऑटो वृद्धि शुरू 1. रीसेट
10

2
कभी-कभी आपको TRUNCATE की अनुमति नहीं है क्योंकि इसके लिए DROP अनुमतियों की आवश्यकता होती है।
ल्यूक कजिन्स

जवाबों:


2024

आप इसके साथ काउंटर रीसेट कर सकते हैं:

ALTER TABLE tablename AUTO_INCREMENT = 1

InnoDB के लिए आप auto_incrementमूल्य को सबसे कम या उच्चतम वर्तमान सूचकांक के बराबर सेट नहीं कर सकते । ( ViralPatel से उद्धरण ):

ध्यान दें कि आप पहले से उपयोग किए गए किसी भी या उससे कम मूल्य के काउंटर को रीसेट नहीं कर सकते। MyISAM के लिए, यदि मान AUTO_INCREMENT कॉलम में वर्तमान में अधिकतम मूल्य से कम या बराबर है, तो मान वर्तमान अधिकतम प्लस एक पर रीसेट हो जाता है। InnoDB के लिए, यदि मान स्तंभ में वर्तमान अधिकतम मान से कम है, तो कोई त्रुटि नहीं होती है और वर्तमान अनुक्रम मान परिवर्तित नहीं होता है।

देखें कि किसी अन्य तालिका से MAX मान का उपयोग करके एक MySQL AutoIncrement कैसे रीसेट करें? गतिशील रूप से स्वीकार्य मूल्य कैसे प्राप्त करें।


8
यह एक भरी हुई तालिका के लिए हमेशा के लिए ले जा सकता है। इसके साथ सावधान रहें: stackoverflow.com/questions/2681869/…
BT

52
यह एकcircular reference
बेसिकन

5
आपका क्या मतलब है curcular reference?
नील्स

73
ध्यान रखें कि MySql एक ही संरचना और नए auto_increment मान के साथ एक नई तालिका बनाएगा, और मूल तालिका से सभी रिकॉर्डों की प्रतिलिपि बनाएँ, मूल ड्रॉप करें और नया नाम बदलें। यदि तालिका बड़ी है, तो उत्पादन परिवेशों पर इसका काफी प्रदर्शन प्रभाव (और डिस्क स्थान) हो सकता है।
रोस्टोल सेप

6
यदि आपके पास पहले से ही AUTOINCREMENT कॉलम है तो क्या यह अत्यधिक मतदान का जवाब वास्तव में काम करता है? MySQL 5.1 डॉक्स के अनुसार: "आप पहले से उपयोग किए गए किसी भी या उससे कम मूल्य के काउंटर को रीसेट नहीं कर सकते। MyISAM के लिए, यदि मान AUTO_INCREMENT कॉलम में वर्तमान में अधिकतम मूल्य से कम या बराबर है, तो।" मान वर्तमान अधिकतम प्लस एक पर रीसेट हो जाता है। इनोबीडीबी के लिए, यदि मान स्तंभ में वर्तमान अधिकतम मूल्य से कम है, तो कोई त्रुटि नहीं होती है और वर्तमान अनुक्रम मान परिवर्तित नहीं होता है। " लगता है कि यहाँ कुछ भी नहीं होगा अगर
स्वैच्छिकता

159
ALTER TABLE tablename AUTO_INCREMENT = 1

7
क्या मुझे पता है कि आपके उत्तर और पिछले उत्तर के बीच अंतर क्या है
प्रवीण श्रीनिवासन

30
@PraveenSrinivasan कोई अंतर नहीं है, हमने उन्हें एक ही समय में जोड़ा
boobiq

79
व्यक्तिगत रूप से, मुझे लगता है कि यह एक सुंदर बात है कि एक AUTO_INCREMENT प्रश्न के लिए इन दो उत्तरों में एक
संगरोध

@MarkGoldfain हाँ यह है!
कंप्यूटर

संगामिति mysql रेस कंडीशन का कारण
बनेगी

81
SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

मुझे लगता है कि यह ऐसा करेगा


2
इस प्रश्न का पहले से ही एक उपयुक्त उत्तर है। इसके अलावा, आपका कॉलम UPDATEसभी मानों को अपडेट करेगा id
कीर्मिट

2
ओपी यह नहीं बताता है कि वे मौजूदा पंक्तियों को फिर से आदेश दे रहे हैं।
कर्मी

पूरा और सही जवाब। लेकिन मुझे संदेह है कि जब हम एक नया मूल्य डालते हैं तो उस मूल्य का PK क्या होगा। चाहे वो 1 हो या अगला पीके?
प्रफुल्लनाथ

हाँ, यह सबसे अच्छा समाधान है, लेकिन आप तालिकाओं को लॉक करना चाह सकते हैं यदि डेटा
रिटेन किया

बहुत उपयोगी है, मैं एक ही requirment था जहाँ मुझे 1 के साथ शुरू करने के लिए auto-increment को रीसेट करना था, केवल पहले दो कमांड ने मदद की।
LOKENDRA


40

यहां छवि विवरण दर्ज करें"ऑपरेशन" टैब के तहत phpmyadmin के साथ एक बहुत ही आसान तरीका है, आप तालिका विकल्प में सेट कर सकते हैं, जिस नंबर को आप चाहते हैं।


आपको उसके ठीक बाद mysql सेवा / सर्वर को पुनरारंभ करने की आवश्यकता है।
साइबर

1
मुझे नहीं लगता कि आपको इसके बाद अपने सर्वर को पुनरारंभ करने की आवश्यकता है। PhpAdmin केवल वेतन वृद्धि बिंदु को बदलने के लिए कमांड चलाएगा।
करीम

आपको पुनः आरंभ करने की आवश्यकता नहीं है, यह अगले इन्सर्ट से प्रभावी होता है।
इल्यूडियमप्यू ३६

36

सबसे अच्छा समाधान जो मेरे लिए काम किया:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;

इसका तेज़, innoDB के साथ काम करता है, और मुझे वर्तमान अधिकतम मूल्य जानने की आवश्यकता नहीं है! इस तरह ऑटो इंक्रीमेंट काउंटर रीसेट हो जाएगा और अधिकतम मूल्य मौजूद होने से यह अपने आप शुरू हो जाएगा।


1
यह NULL auto-inc value को information_schema पर सेट करेगा; जाँचSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
के-गन

1
मैंने 5.6.x संस्करण पर परीक्षण किया और इसने पूरी तरह से काम किया, और केरेम ग्यून द्वारा की गई क्वेरी ने अधिकतम मान एक लौटाया, जैसा कि कहा नहीं गया है। (हो सकता है कि यह पहली क्वेरी के बाद शून्य करने के लिए सेट हो, लेकिन यह दूसरी क्वेरी के बाद नहीं है) मेरा मानना ​​है कि यह InnsDB के लिए सबसे अच्छा समाधान है।
फ्रैंक फोर्ट

समान स्पष्ट मान के रूप में समान: "एक नई तालिका बनाएं, एक ही संरचना और नए ऑटो_संचाई मूल्य के साथ और मूल तालिका से सभी रिकॉर्ड की प्रतिलिपि बनाएँ, मूल को छोड़ें और नया नाम बदलें। इससे काफी प्रदर्शन प्रभाव (और डिस्क स्थान) हो सकता है। उत्पादन वातावरण पर अगर मेज बड़ी है। " लेकिन बहुत बुरा है क्योंकि दो बार पूर्ण प्रतिलिपि तालिका की जरूरत है।
Enyby

मैं सत्यापित करता हूं कि यह संस्करण के लिए काम करता है 5.6.15, जबकि ALTER TABLE tablename AUTO_INCREMENT = 1ऐसा नहीं है
नाए

24

इस प्रश्न के उच्चतम मूल्यांकित उत्तर सभी "अपने अनुकूली AUTO_INCREMENT = मान" की सिफारिश करते हैं। हालाँकि, यह केवल तभी काम करता है जब valueपरिवर्तन ऑटोइन्क्रिमेंट कॉलम के वर्तमान अधिकतम मूल्य से अधिक हो। MySQL 8 प्रलेखन के अनुसार :

आप वर्तमान में उपयोग किए जाने वाले मान से कम या अधिक के लिए काउंटर को रीसेट नहीं कर सकते। दोनों InnoDB और MyISAM के लिए, यदि मान AUTO_INCREMENT कॉलम में वर्तमान में अधिकतम मान से कम या बराबर है, तो मान वर्तमान अधिकतम AUTO_INCREMENT स्तंभ मान प्लस एक पर रीसेट हो जाता है।

संक्षेप में, आप केवल स्वत: कॉलम के मूल्य को बढ़ाने के लिए AUTO_INCREMENT को बदल सकते हैं, इसे 1 पर रीसेट नहीं कर सकते, जैसा कि ओपी प्रश्न के दूसरे भाग में पूछता है। उन विकल्पों के लिए जो वास्तव में आपको AUTO_INCREMENT को इसके वर्तमान अधिकतम से नीचे सेट करने की अनुमति देते हैं, Reorder / रीसेट ऑटो इंक्रीमेंट प्राइमरी की पर एक नज़र डालें ।


20

अपडेट जोड़ना क्योंकि MySQL 5.6 में कार्यक्षमता बदल गई है। MySQL 5.6 के रूप में आप इनोबीडी के साथ साधारण अलर्ट का उपयोग कर सकते हैं:

ALTER TABLE tablename AUTO_INCREMENT = 1;

इसे दर्शाने के लिए डॉक्स अपडेट किए गए हैं:

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

मेरे परीक्षण से यह भी पता चलता है कि तालिका की प्रतिलिपि नहीं बनाई गई है, मान बस बदला गया है।


19

इसमें अच्छे विकल्प दिए गए हैं How To Reset MySQL Autoincrement Column

ध्यान दें कि InnoDB के लिए काम नहींALTER TABLE tablename AUTO_INCREMENT = value; करता है


8
क्या आप इसे InnoDB के साथ कैसे करते हैं?
एम्प्टीअर्सल

4
MySQL v 5.6.2
एडी बी

मेरे पास एक समान मुद्दा था जहां एक मेज से रिकॉर्ड हटाने के बाद एक ऑटोइन्क्रिमेंट फ़ील्ड रीसेट नहीं हो रहा था। TRUNCATE ने काम किया प्रतीत होता है। मुझे लगता है कि निरस्तीकरण को हटाने के लिए नीचे दिए गए समाधान और फिर से आवेदन करने से इसे कम करने में मदद मिल सकती है।
क्रेग मैलोनी

@CraigMaloney - DELETE(या ROLLBACK) आईडी पुनर्प्राप्त नहीं करेगा। एक अपवाद: पुनरारंभ (या क्रैश) के बाद, अगली आईडी की गणना की जाती है MAX(id)+1, जिससे अंत में हटाए गए आईडी को प्रभावी ढंग से पुनर्प्राप्त किया जा सकता है । अपवाद के अपवाद: MySQL 8.0 उन आईडी को अप्रयुक्त छोड़ देता है।
रिक जेम्स

12
ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)

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

ध्यान दें कि तालिका के भीतर सभी फ़ील्ड्स को फिर से जोड़ा जाएगा और अन्य आईडी होंगे !!!।


3
मैं इस तरह से कुछ करना चाहता हूँ! लेकिन एक अतिरिक्त चेतावनी के रूप में; यह स्पष्ट रूप से आपके विदेशी कुंजी को पूरी तरह से तोड़ देगा।
NoobishPro

12

आप TRUNCATEइस तरह से सिंटैक्स तालिका का उपयोग कर सकते हैं : TRUNCATE TABLE table_name

सावधान !! अपने में सब कुछ मिटाTRUNCATE TABLE your_table देंगे !!your_table


14
नए प्रोग्रामर , जागरूक रहें जो निर्दिष्ट तालिका में आपकी सभी पंक्तियों को हटाTRUNCATE देगा !
Zanshin13

1
उपरोक्त टिप्पणी को उत्तर में डाला जाना चाहिए, या कम से कम ट्रंकट के वास्तविक उपयोग के बारे में स्पष्टीकरण देना चाहिए।
लुकास कुज

TRUNCATEauto_incrementखेतों को भी रीसेट करेगा ? मेरा उपयोग मामला साफ करने के लिए है पुराने डेटा को तालिका में और नए डेटा के लिए आईडी को फिर से शुरू करने के लिए है (कल्पना करें, परीक्षण पूरा होने के बाद उचित उपयोग के लिए तालिका साफ़ करना)। मैंने सोचा कि मुझे DROPपूरी मेज पर जाना होगा और CREATEइसे फिर से।
ADTC

हां, TRUNCATE टेबल पर रीसेट की तरह काम करता है। यह पूरी तरह से सच नहीं है अगर इसे बनाने के बाद से एक तालिका बदल दी गई है, तो उन परिवर्तनों को रीसेट नहीं किया जाएगा। मुझे लगता है कि टेबल संरचना को निर्यात करने और वास्तविक रीसेट की तुलना में एक नई तालिका बनाने के लिए निर्यात का उपयोग करने के करीब है।
क्रिस

हां @ADTC। यदि आप वर्तमान मूल्य रखना चाहते हैं auto_increment, तो DELETE FROMइसके बजाय का उपयोग करें TRUNCATE
TRIG

8

यह खाली टेबल के लिए है:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

यदि आपके पास डेटा है, लेकिन आप इसे साफ करना चाहते हैं, तो मैं इसका उपयोग करने की सलाह देता हूं:

ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD  `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);

इस का उपयोग करने के लिए सरल
अब्दुल अजीज अल बसीर

यह हमारे लिए डेटा के साथ काम करता है। यह पंक्ति को अगले सूचकांक पर रीसेट करता है। धन्यवाद!
चकाचौंध

urwell @ चकाचौंध!
अब्दुल अजीज अल बसीर

5

यहां मेरा समाधान है, लेकिन मैं यह करने की सलाह नहीं दूंगा यदि आपके कॉलम में बाधाएं हैं या अन्य तालिकाओं के लिए विदेशी कुंजी के रूप में जुड़ा हुआ है क्योंकि यह बुरा प्रभाव होगा या काम भी नहीं करेगा।

> पहला: कॉलम ड्रॉप करें

ALTER TABLE tbl_name DROP COLUMN column_id

> दूसरा: कॉलम को फिर से बनाएँ और इसे एफआईआरएसटी के रूप में सेट करें यदि आप इसे पहले कॉलम के रूप में चाहते हैं जो मैं मानता हूं।

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

यह अच्छी तरह से काम करता है!


3

MySQL 5.6 के अनुसार नीचे का दृष्टिकोण ऑनलाइन DDL (नोट algorithm=inplace) के कारण तेजी से काम करता है :

alter table tablename auto_increment=1, algorithm=inplace;


2

आप बस अनुक्रम को रीसेट करने के लिए तालिका को काट सकते हैं

TRUNCATE TABLE TABLE_NAME

1

मैंने तालिका को बदलने की कोशिश की और Auto_increment को 1 पर सेट किया, लेकिन यह काम नहीं किया। मैंने जो कॉलम नाम में वृद्धि कर रहा था, उसे हटाने का संकल्प लिया, फिर अपने पसंदीदा नाम के साथ एक नया कॉलम बनाएँ और उस नए कॉलम को शुरुआत से बढ़ाएँ।


क्या आप बता सकते हैं कि आपने ऐसा कैसे किया?
मज़ारगोज़ा

@MZaragoza बस पुराने कॉलम को ड्रॉप करें जिसमें कोई AI नहीं है फिर एक नया बनाएं जो AI सक्षम है।
andromeda

क्या आप इसे दिखाने के लिए अपना जवाब अपडेट कर सकते हैं। मैं वास्तव में इसकी सराहना
करूंगा

1

एक तालिका के लिए ऑटो वेतन वृद्धि काउंटर दो तरीकों से सेट (पुनः) हो सकता है:

  1. किसी क्वेरी को निष्पादित करके, जैसे अन्य लोगों ने पहले ही समझाया:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. कार्यक्षेत्र या अन्य दृश्य डेटाबेस डिज़ाइन टूल का उपयोग करना। मैं कार्यक्षेत्र में यह दिखाने जा रहा हूं कि यह कैसे किया जाता है - लेकिन यह अन्य टूल में भी बहुत अलग नहीं होना चाहिए। इच्छित तालिका पर राइट क्लिक करें और Alter tableसंदर्भ मेनू से चयन करें । तल पर आप तालिका बदलने के लिए सभी उपलब्ध विकल्प देख सकते हैं। चुनें Optionsऔर आपको यह फॉर्म मिलेगा: यहां छवि विवरण दर्ज करें

    फिर क्षेत्र में वांछित मान सेट करें Auto incrementजैसा कि छवि में दिखाया गया है। यह मूल रूप से पहले विकल्प में दिखाए गए क्वेरी को निष्पादित करेगा।


0

नवीनतम प्लस एक आईडी अपडेट करने के लिए

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);


0

मैंने गुगली की और यह सवाल पाया, लेकिन जवाब मैं वास्तव में दो मानदंडों को पूरा करने के लिए देख रहा हूं:

  1. विशुद्ध रूप से MySQL प्रश्नों का उपयोग करना
  2. मौजूदा तालिका ऑटो-वृद्धि को अधिकतम (आईडी) + 1 पर रीसेट करें

चूँकि मुझे वह नहीं मिल रहा है जो मैं यहाँ चाहता हूँ, मैंने विभिन्न उत्तरों से उत्तर को हटा दिया है और यहाँ साझा कर रहा हूँ।

ध्यान देने योग्य कुछ बातें:

  1. सवाल में तालिका InnoDB है
  2. तालिका प्राथमिक कुंजी के idरूप intमें फ़ील्ड के साथ फ़ील्ड का उपयोग करती है
  3. MySQL में विशुद्ध रूप से ऐसा करने का एकमात्र तरीका संग्रहीत कार्यविधि का उपयोग करना है
  4. नीचे मेरे चित्र GUI के रूप में SequelPro का उपयोग कर रहे हैं। आपको अपने पसंदीदा MySQL संपादक के आधार पर इसे अनुकूलित करने में सक्षम होना चाहिए
  5. मैंने इसे MySQL Ver 14.14 Distrib 5.5.61 पर, debian-linux-gnu के लिए परीक्षण किया है

चरण 1: संग्रहित प्रक्रिया बनाएँ

इस तरह एक संग्रहीत प्रक्रिया बनाएँ:

DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN

      SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
      PREPARE stmt FROM @get_next_inc; 
      EXECUTE stmt; 
      SELECT @next_inc AS result;
      DEALLOCATE PREPARE stmt; 

      set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

फिर इसे चलाएं।

चलाने से पहले, यह ऐसा दिखता है जब आप अपने डेटाबेस में संग्रहीत प्रक्रियाओं के तहत देखते हैं।

यहां छवि विवरण दर्ज करें

जब मैं दौड़ता हूं, तो मैं केवल संग्रहीत प्रक्रिया का चयन करता हूं और रन चयन को दबाता हूं

यहां छवि विवरण दर्ज करें

नोट: सीमांकक भाग महत्वपूर्ण हैं। इसलिए यदि आप इस प्रश्न में शीर्ष चयनित उत्तरों से कॉपी और पेस्ट करते हैं, तो वे इस कारण से काम नहीं करते हैं।

मुझे चलाने के बाद, मुझे संग्रहीत प्रक्रिया को देखना चाहिए

यहां छवि विवरण दर्ज करें

यदि आपको संग्रहीत प्रक्रिया को बदलने की आवश्यकता है, तो आपको संग्रहीत प्रक्रिया को हटाने की आवश्यकता है, फिर से फिर से चलाने का चयन करें।

चरण 2: संग्रहीत कार्यविधि को कॉल करें

इस बार आप केवल सामान्य MySQL प्रश्नों का उपयोग कर सकते हैं।

call reset_autoincrement('products');

मूल रूप से https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc में मेरे अपने एसक्यूएल प्रश्नों के नोट्स और StackOverflow के लिए अनुकूलित



-1

इस क्वेरी को चलाने का प्रयास करें

 ALTER TABLE tablename AUTO_INCREMENT = value;

या रीसेट ऑटो वृद्धि के लिए इस क्वेरी का प्रयास करें

 ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;

और Auto Increment को Set करें फिर इस Query को Run करें

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

-2

मेरा सुझाव है कि आप क्वेरी ब्राउज़र पर जाएं और निम्नलिखित कार्य करें:

  1. स्कीमाटा पर जाएं और उस तालिका को ढूंढें जिसे आप बदलना चाहते हैं।
  2. राइट क्लिक करें और कॉपी क्रिएट स्टेटमेंट चुनें।
  3. एक परिणाम टैब खोलें और बनाएँ स्टेटमेंट को पेस्ट करें।
  4. बनाएँ कथन की अंतिम पंक्ति पर जाएँ और Auto_Increment = N, (जहाँ N, auto_increment फ़ील्ड के लिए एक वर्तमान संख्या है) देखें।
  5. एन को 1 से बदलें।
  6. ctrl+enter दबाएं ।

तालिका में नई पंक्ति दर्ज करते ही Auto_increment को एक पर रीसेट करना चाहिए।

मुझे नहीं पता कि यदि आप एक पंक्ति जोड़ने का प्रयास करते हैं तो क्या होगा जहां एक auto_increment फ़ील्ड मान पहले से मौजूद है।

उममीद है कि इससे मदद मिलेगी!


-2

सबसे अच्छा तरीका एआई के साथ क्षेत्र को हटा दें और एआई के साथ फिर से जोड़ दें, सभी तालिकाओं के लिए काम करता है


1
सबसे अच्छा तरीका नहीं है, एक स्तंभ छोड़ने से स्तंभ डेटा खो जाएगा
Disha Goyal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.