ट्रांजैक्शन और ROLLBACK द्वारा ऑटो-इन्क्रीमेंट मान आरक्षित करना
कभी-कभी आपको भविष्य के उपयोग के लिए ऑटो-इन्क्रीमेंट मानों का एक ब्लॉक "आरक्षित" करना होता है (उदाहरण: बाहरी सिस्टम के साथ सिंक)। इसे ट्रांजैक्शन में पंक्तियां डालकर और फिर रोलबैक करके किया जा सकता है।
विधि
START TRANSACTION; INSERT INTO yourTable VALUES (), (), (), (); -- 4 पंक्तियां डालें ROLLBACK; SELECT LAST_INSERT_ID() INTO @reservedValue;
उदाहरण
CREATE TABLE reservingAutoIncrementDemo (
UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
START TRANSACTION;
INSERT INTO reservingAutoIncrementDemo VALUES (), (), (), ();
SELECT * FROM reservingAutoIncrementDemo; -- आईडी 1,2,3,4 दिखेंगे
ROLLBACK;
SELECT LAST_INSERT_ID() INTO @IncrementedValue;
SELECT @IncrementedValue;
आउटपुट
+-------------------+ | @IncrementedValue | +-------------------+ | 1 | +-------------------+
व्याख्या
INSERT ... VALUES ()डिफ़ॉल्ट मान (ऑटो-इन्क्रीमेंट के लिए अगला मान) डालता है।ROLLBACKपंक्तियों को हटा देता है, लेकिन ऑटो-इन्क्रीमेंट काउंटर आगे बढ़ा रहता है (InnoDB में यह व्यवहार संस्करण पर निर्भर कर सकता है; 8.0+ में काउंटर रोलबैक पर भी बढ़ा रहता है)।LAST_INSERT_ID()अंतिम सफल INSERT द्वारा जनरेटेड पहला ऑटो-इन्क्रीमेंट मान लौटाता है।
चेतावनी और विकल्प
- यह व्यवहार स्टोरेज इंजन और संस्करण पर निर्भर करता है। MyISAM में काउंटर रोलबैक पर रीसेट हो सकता है।
- उत्पादन में "ID रिजर्वेशन" के लिए बेहतर: एक अलग
sequenceटेबल या MySQL 8.0+ केSEQUENCEऑब्जेक्ट (MariaDB) उपयोग करें। AUTO_INCREMENT = Nसे अगला मान सेट करें:ALTER TABLE tbl AUTO_INCREMENT = 1000;