2010-07-31 11 views
101

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

स्थिति स्ट्रिंग प्राथमिक कुंजी के लिए कोई अलग होगी? (एक "बनाएँ अद्वितीय सूचकांक" होगा बयान के रूप में एक ही तरह से में)

उत्तर

112

It does it for you.

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

+5

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

+1

'sqlite_masteroindex_' से शुरू होने वाले नाम के साथ' sqlite_master' तालिका में इसका उल्लेख है। – dan04

+1

विच का अर्थ है कि, mysql के विपरीत, जब आप विदेशी कुंजी बनाते हैं तो आपको अक्सर इंडेक्स जोड़ने की आवश्यकता होती है। क्या यह ? –

7

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

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

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

7

यदि कोई स्तंभ INTEGER प्राथमिक कुंजी चिह्नित किया गया है, तो वास्तव में यह लगभग लगभग किसी भी अन्य प्राथमिक कुंजी या अनुक्रमित मान निर्दिष्ट करके समान खोज के रूप में तेज़ी से होता है। इसका कारण यह है है:

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

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

इस तरह के कॉलम को आमतौर पर "पूर्णांक प्राथमिक कुंजी" के रूप में जाना जाता है। प्राथमिक कुंजी कॉलम केवल एक पूर्णांक प्राथमिक कुंजी बन जाता है यदि घोषित प्रकार का नाम बिल्कुल "INTEGER" है। अन्य इंटीजर प्रकार के नाम जैसे "आईएनटी" या "बिगिनट" या "लघु इंटेग्रर" या "अनसुलझा इंटेगर" प्राथमिक कुंजी कॉलम को पूर्णांक कॉलम के रूप में व्यवहार करने के लिए पूर्णांक कॉलम के रूप में व्यवहार करने के लिए पूर्णांक कॉलम और एक अद्वितीय इंडेक्स के रूप में कार्य करता है, न कि उपनाम के रूप में पंक्तिबद्ध

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

संबंधित मुद्दे