MyISAM इस व्यवहार का समर्थन करता है। दो-स्तंभ प्राथमिक कुंजी बनाएं, और दूसरा . बनाएं कॉलम ऑटो-इन्क्रीमेंट। यह पहले कॉलम में प्रत्येक विशिष्ट मान के लिए शुरू होगा।
CREATE TABLE t (i INT, j INT AUTO_INCREMENT, PRIMARY KEY (i,j)) ENGINE=MyISAM;
INSERT INTO t (i) VALUES (1), (1), (2), (2), (1), (3);
SELECT * FROM t;
+---+---+
| i | j |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+---+---+
लेकिन अगर आप इसके बारे में सोचते हैं, तो यह स्टोरेज इंजन में केवल थ्रेड-सुरक्षित है जो टेबल-लेवल लॉकिंग करता है। INSERT स्टेटमेंट के लिए। क्योंकि INSERT को अधिकतम j
. खोजने के लिए तालिका में अन्य पंक्तियों को खोजना होगा प्रति समान मान i
मूल्य। यदि अन्य लोग एक साथ INSERT कर रहे हैं, तो यह एक दौड़ की स्थिति पैदा करता है।
इस प्रकार, MyISAM पर निर्भरता, जो INSERT पर टेबल-लेवल लॉकिंग करती है।
इस संदर्भ को मैनुअल में देखें:http:// dev.mysql.com/doc/refman/5.6/hi/example-auto-increment.html अनुभाग के अंतर्गत, MyISAM नोट्स ।
MyISAM का उपयोग न करने के कई अच्छे कारण हैं। मेरे लिए निर्णायक कारक MyISAM की डेटा भ्रष्ट करने की प्रवृत्ति है।
अपनी टिप्पणी दें:
InnoDB ऊपर वर्णित वृद्धि-प्रति-समूह व्यवहार का समर्थन नहीं करता है। आप एक बहु-स्तंभ प्राथमिक कुंजी बना सकते हैं, लेकिन आपको जो त्रुटि मिली है वह यह है कि InnoDB के लिए आवश्यक है कि ऑटो-इन्क्रीमेंट कॉलम तालिका की कुंजी में पहला कॉलम हो (यह सख्ती से प्राथमिक कुंजी होना जरूरी नहीं है)पी>
मल्टी-कॉलम कुंजी में ऑटो-इंक्रीमेंट कॉलम की स्थिति के बावजूद, यह केवल तभी बढ़ता है जब आप इसे InnoDB के साथ उपयोग करते हैं; यह दूसरे कॉलम में प्रति विशिष्ट मान के लिए प्रविष्टियों की संख्या नहीं रखता है।
एक InnoDB तालिका के साथ ऐसा करने के लिए, आपको दौड़ की स्थिति से बचने के लिए, INSERT की अवधि के लिए तालिका को स्पष्ट रूप से लॉक करना होगा। आप जिस समूह में सम्मिलित कर रहे हैं उसमें अधिकतम मान के लिए आप अपनी स्वयं की SELECT क्वेरी करेंगे। फिर वह मान + 1 डालें।
मूल रूप से, आपको ऑटो-इन्क्रीमेंट फीचर को बायपास करना होगा और मानों को स्वचालित रूप से जेनरेट करने के बजाय निर्दिष्ट करना होगा।