MyISAM इंजन के साथ कम्पोजिट प्राइमरी की में AUTO_INCREMENT
InnoDB कम्पोजिट प्राइमरी की में AUTO_INCREMENT कॉलम को पहले कॉलम के रूप में रखने की आवश्यकता होती है और यह प्रति समूह अनुक्रम नहीं करता। MyISAM इंजन एक अनूठी सुविधा प्रदान करता है: कम्पोजिट प्राइमरी की का दूसरा कॉलम AUTO_INCREMENT हो सकता है और यह पहले कॉलम के मान के आधार पर प्रति समूह अनुक्रमित होता है।
उदाहरण: MyISAM के साथ
1. टेबल बनाएं
mysql> CREATE TABLE TwoPrimaryKeyTableDemo (
-> Result ENUM('First','Second','Third','Fail') NOT NULL,
-> StudentId INT NOT NULL AUTO_INCREMENT,
-> StudentName VARCHAR(200) NOT NULL,
-> PRIMARY KEY(Result, StudentId)
-> ) ENGINE=MyISAM;
2. रिकॉर्ड डालें
mysql> INSERT INTO TwoPrimaryKeyTableDemo(StudentName, Result) VALUES('John', 'Fail');
mysql> INSERT INTO TwoPrimaryKeyTableDemo(StudentName, Result) VALUES('Carol', 'First');
mysql> INSERT INTO TwoPrimaryKeyTableDemo(StudentName, Result) VALUES('Smith', 'Third');
mysql> INSERT INTO TwoPrimaryKeyTableDemo(StudentName, Result) VALUES('Johnson', 'Second');
mysql> INSERT INTO TwoPrimaryKeyTableDemo(StudentName, Result) VALUES('Johnson', 'Third');
mysql> INSERT INTO TwoPrimaryKeyTableDemo(StudentName, Result) VALUES('Carol', 'Second');
mysql> INSERT INTO TwoPrimaryKeyTableDemo(StudentName, Result) VALUES('Carol', 'Fail');
3. क्रमबद्ध परिणाम देखें
mysql> SELECT * FROM TwoPrimaryKeyTableDemo ORDER BY StudentId, Result;
आउटपुट:
+--------+-----------+-------------+ | Result | StudentId | StudentName | +--------+-----------+-------------+ | First | 1 | Carol | | Second | 1 | Johnson | | Third | 1 | Smith | | Fail | 1 | John | | Second | 2 | Carol | | Third | 2 | Johnson | | Fail | 2 | Carol | +--------+-----------+-------------+
व्यवहार व्याख्या
- प्रत्येक Result मान (प्राइमरी की का पहला कॉलम) के लिए, StudentId 1 से शुरू होता है और स्वतंत्र रूप से बढ़ता है।
- यह केवल MyISAM के साथ काम करता है। InnoDB इसका समर्थन नहीं करता।
- AUTO_INCREMENT कॉलम प्राइमरी की का अंतिम कॉलम होना चाहिए।
InnoDB विकल्प
InnoDB में, आप इस व्यवहार को अनुकरण कर सकते हैं:
- एक अलग अनुक्रम टेबल का उपयोग करके
- एप्लिकेशन लेयर पर अनुक्रम प्रबंधन करके
- विंडो फ़ंक्शन (MySQL 8.0+) के साथ
ROW_NUMBER() OVER (PARTITION BY Result ORDER BY ...)का उपयोग करके
चेतावनी
MyISAM ट्रांजैक्शन, विदेशी कुंजी, और पंक्ति-स्तरीय लॉकिंग का समर्थन नहीं करता। अधिकांश आधुनिक एप्लिकेशन के लिए InnoDB पसंदीदा इंजन है।