MySQL में InnoDB इंजन (डिफ़ॉल्ट) के साथ आप ऑटो-इन्क्रीमेंट मान को वर्तमान अधिकतम से कम मान पर सेट नहीं कर सकते। इसके लिए MyISAM इंजन की आवश्यकता होती है, या तालिका को पुनर्निर्माण करना पड़ता है।
आधिकारिक दस्तावेज़ अनुसार व्यवहार:
MyISAM: यदि मान वर्तमान AUTO_INCREMENT कॉलम में अधिकतम मान से कम या बराबर है, तो मान वर्तमान अधिकतम + 1 पर रीसेट हो जाता है।
InnoDB: यदि मान कॉलम में वर्तमान अधिकतम मान से कम है, तो कोई त्रुटि नहीं होती लेकिन वर्तमान अनुक्रम मान अपरिवर्तित रहता है।
MyISAM इंजन के साथ उदाहरण
mysql> CREATE TABLE DemoTable (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE='MyISAM'; mysql> INSERT INTO DemoTable VALUES (), (), (), (), (), (); -- 6 पंक्तियाँ (ID 1-6) mysql> SELECT * FROM DemoTable;
आउटपुट: ID 1, 2, 3, 4, 5, 6
ID 4, 5, 6 हटाना
mysql> DELETE FROM DemoTable WHERE Id IN (4, 5, 6);
शेष: ID 1, 2, 3
ऑटो-इन्क्रीमेंट को कम मान (4) पर सेट करना
mysql> ALTER TABLE DemoTable AUTO_INCREMENT = 4;
आउटपुट: Query OK, 3 rows affected (0.38 sec)
नई पंक्तियां डालना और जांचना
mysql> INSERT INTO DemoTable VALUES (), (), (); -- 3 नई पंक्तियाँ mysql> SELECT * FROM DemoTable;
आउटपुट:
+----+ | Id | +----+ | 1 | | 2 | | 3 | | 4 | -- नया ऑटो-इन्क्रीमेंट 4 से शुरू | 5 | | 6 | +----+
InnoDB के लिए समाधान:
- तालिका को MyISAM में बदलें, ऑटो-इन्क्रीमेंट सेट करें, वापस InnoDB में बदलें (छोटी तालिकाओं के लिए)
- नई तालिका बनाएं वांछित ऑटो-इन्क्रीमेंट के साथ, डेटा कॉपी करें, नाम बदलें
TRUNCATE TABLE(सभी डेटा हटा देता है, ऑटो-इन्क्रीमेंट रीसेट करता है)
चेतावनी: ऑटो-इन्क्रीमेंट मान कम करना डुप्लिकेट कुंजी त्रुटियों का कारण बन सकता है यदि एप्लिकेशन क्रमिक ID पर निर्भर करता है।