SQLite में एक प्राथमिक कुंजी के लिए एक सूचकांक की आवश्यकता है?


130

जब किसी पूर्णांक स्तंभ को SQLite तालिका में एक प्राथमिक कुंजी के रूप में चिह्नित किया जाता है, तो क्या इसके लिए भी एक सूचकांक स्पष्ट रूप से बनाया जाना चाहिए? SQLite स्वचालित रूप से एक प्राथमिक कुंजी कॉलम के लिए एक इंडेक्स बनाने के लिए प्रकट नहीं होता है, लेकिन शायद यह अपने उद्देश्य को देखते हुए इसे वैसे भी अनुक्रमित करता है? (मैं हर समय उस कॉलम पर खोज करता रहूंगा)।

क्या स्ट्रिंग प्राथमिक कुंजी के लिए स्थिति किसी भी भिन्न होगी?

जवाबों:


148

यह आपके लिए करता है।

अलग-अलग प्राथमिक कुंजी स्तंभों को अलग कर देता है, दोनों UNIQUE और PRIMARY KEY बाधाओं को डेटाबेस में एक इंडेक्स बनाकर कार्यान्वित किया जाता है (उसी तरह जैसे "CREATE UNIQUE INDEX" कथन होगा)। इस तरह के सूचकांक का उपयोग प्रश्नों को अनुकूलित करने के लिए डेटाबेस में किसी भी अन्य सूचकांक की तरह किया जाता है। नतीजतन, स्तंभों के एक सेट पर एक इंडेक्स बनाने में अक्सर कोई लाभ (लेकिन महत्वपूर्ण ओवरहेड) नहीं होता है जो पहले से ही सामूहिक रूप से एक UNIQUE या प्राथमिक कुंजी बाधा के अधीन हैं।


8
दरअसल, यह कहता है कि "प्राथमिक कुंजी विशेषता सामान्य रूप से स्तंभ या स्तंभ पर एक अद्वितीय सूचकांक बनाती है जो कि प्राथमिक कुंजी के रूप में निर्दिष्ट होती है"। हालाँकि, वह सूचकांक SQLite प्रबंधन अनुप्रयोगों में दिखाई नहीं देता है, यही कारण है कि मैंने पूछा।
मिर्क जेडलीस्की

1
यह sqlite_masterतालिका में एक नाम के साथ शुरू होने का उल्लेख है sqlite_autoindex_
dan04

2
देर से, लेकिन @NicolasZozol हां, अगर आपको यह मौजूद नहीं है, तो आपको माता-पिता / संदर्भित क्षेत्र (ओं) पर एक सूचकांक (या बाधा) बनाने की आवश्यकता है; यह अनुशंसा की जाती है कि बच्चे / संदर्भित क्षेत्र (ओं) में एक सूचकांक है (जो आमतौर पर अद्वितीय नहीं होगा): यहाँ देखेंUNIQUEUNIQUE
TriHHound

2
हम्म, SQL Data Constraints यहाँ अनुभाग कहता है: ज्यादातर मामलों में, डेटाबेस में एक अद्वितीय सूचकांक बनाकर UNIQUE और PRIMARY KEY बाधाओं को लागू किया जाता है। (अपवाद INTIMER प्राथमिक कुंजी और प्राथमिक कुंजी बिना टेबल के हैं।)। तो जवाब हमेशा सच नहीं होता है?
चंचल जिज्ञासा

3
ऐसा लगता है कि पंक्तिबद्ध IS अनुक्रमित है, लेकिन अलग-अलग sqlite.org/lang_createtable.html#rowid को कार्यान्वित किया गया है। पंक्तिबद्ध तालिकाओं के डेटा को B- ट्री संरचना के रूप में संग्रहीत किया जाता है, जिसमें प्रत्येक तालिका पंक्ति के लिए एक प्रविष्टि होती है, कुंजी के रूप में पंक्तिबद्ध मान का उपयोग करके ... खोज एक विशिष्ट उपद्रवी के साथ एक रिकॉर्ड के लिए ... किसी भी अन्य प्राथमिक कुंजी या अनुक्रमित मूल्य को निर्दिष्ट करके बनाई गई समान खोज के रूप में लगभग दो बार तेज है।
matreshkin

15

यदि कोई स्तंभ INTIMER PRIMARY KEY से चिह्नित होता है, तो यह वास्तव में किसी अन्य PRIMARY KEY या अनुक्रमित मान को निर्दिष्ट करके बनाई गई एक समान खोज के रूप में दोगुना तेज़ है । यह है क्योंकि:

... SQLite तालिकाओं के भीतर सभी पंक्तियों में 64-बिट हस्ताक्षरित पूर्णांक कुंजी है जो विशिष्ट रूप से अपनी तालिका के भीतर की पंक्ति को पहचानती है ... एक विशिष्ट पंक्ति के साथ रिकॉर्ड के लिए खोज, या एक निर्दिष्ट सीमा के भीतर पंक्ति के साथ सभी रिकॉर्ड के लिए लगभग दो बार के रूप में है। किसी भी अन्य प्राथमिक कुंजी या अनुक्रमित मान को निर्दिष्ट करके बनाई गई समान खोज के रूप में उपवास।

नीचे दिए गए एक अपवाद के साथ, यदि एक पंक्ति तालिका में एक प्राथमिक कुंजी होती है जिसमें एक एकल स्तंभ होता है और उस स्तंभ का घोषित प्रकार ऊपरी और निचले मामले के किसी भी मिश्रण में "INTEGER" होता है, तो स्तंभ पंक्तिदार के लिए एक उपनाम बन जाता है।

इस तरह के कॉलम को आमतौर पर "पूर्णांक प्राथमिक कुंजी" के रूप में संदर्भित किया जाता है। एक प्राथमिक कुंजी स्तंभ केवल पूर्णांक प्राथमिक कुंजी बन जाता है यदि घोषित प्रकार का नाम "INTEGER" है। अन्य पूर्णांक प्रकार के नाम जैसे "INT" या "BIGINT" या "SHORT INTEGER" या "UNSIGNED INTEGER" प्राथमिक कुंजी स्तंभ को पूर्णांक आत्मीयता और एक अद्वितीय सूचकांक के साथ व्यवहार करने का कारण बनता है, न कि पंक्ति के लिए उपनाम के रूप में।

देखें: http://www.sqlite.org/lang_createtable.html#rowid


8

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

इसे बनाने के बाद, यह आवश्यक होने पर इसका उपयोग करेगा।

यह निश्चित रूप से, हमेशा खंडित नहीं होगा, और यदि आप चाहते हैं कि आप स्कीमा में आमतौर पर निर्दिष्ट करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.