2008-10-01 5 views
15

मैं एक एसक्यूएल क्वेरी के साथ, जानना चाहता हूं कि कोई सूचकांक अद्वितीय है या नहीं। मैं SQLite उपयोग कर रहा हूँ 3.मैं कैसे पता लगा सकता हूं कि SQLite अनुक्रमणिका अद्वितीय है या नहीं? (एसक्यूएल के साथ)

मैं दो तरीकों की कोशिश की है:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1' 

यह सूचकांक ("प्रकार" के बारे में जानकारी देता है, "नाम", "tbl_name", "rootpage" और "एसक्यूएल")। ध्यान दें कि एसक्यूएल कॉलम खाली है जब इंडेक्स स्वचालित रूप से SQLite द्वारा बनाया गया है।

PRAGMA index_info(sqlite_autoindex_user_1); 

यह सूचकांक ("seqno", "cid" और "name") में कॉलम देता है।

कोई अन्य सुझाव?

संपादित करें: उपर्युक्त उदाहरण ऑटो-जेनरेटेड इंडेक्स के लिए है, लेकिन मेरा प्रश्न सामान्य रूप से इंडेक्स के बारे में है। उदाहरण के लिए, मैं "इंडेक्स इंडेक्स इंडेक्स 1 विज़िट (उपयोगकर्ता, दिनांक) पर" एक इंडेक्स बना सकता हूं। ऐसा लगता है कि मेरी नई अनुक्रमणिका अद्वितीय नहीं है या नहीं, तो कोई SQL कमांड नहीं दिखाएगा।

+0

क्या आप उदाहरण दे सकते हैं कि स्वचालित रूप से जेनरेट की गई अनुक्रमणिका अद्वितीय नहीं है? मैंने जो देखा है वह हमेशा अद्वितीय रहा है। – finnw

+0

प्राथमिक कुंजी के लिए ऑटोइंडेक्स उत्पन्न होता है, जो परिभाषा अद्वितीय – Noah

उत्तर

31
PRAGMA INDEX_LIST('table_name'); 

रिटर्न पर SQLite वेबसाइट दस्तावेज़ देखें 3 कॉलम वाली एक तालिका:

  1. seq यूनिक ई सूचकांक की अंकीय आईडी
  2. सूचकांक का नाम name
  3. unique विशिष्टता ध्वज (यदि अशून्य UNIQUE सूचकांक।)

तो बस जिसके परिणामस्वरूप पंक्तियों के माध्यम से लूप जब तक आप सूचकांक आप करना चाहते हैं के नाम को देखने क्वेरी (दुर्भाग्य से आपके पास PRAGMA कथन में WHERE खंड नहीं हो सकता है।)

1

आप प्रोग्रामिंग रूप से एक चुनिंदा कथन बना सकते हैं यह देखने के लिए कि कोई भी टुपल्स एक से अधिक पंक्तियों को इंगित करता है या नहीं। यदि आप वापस तीन कॉलम, foo, बार और baz मिलता है, निम्न क्वेरी

select count(*) from t 
group by foo, bar, baz 
having count(*) > 1 

बनाने कि किसी भी पंक्तियों देता है, तो अपनी अनुक्रमणिका नहीं अद्वितीय, यह देखते हुए टपल करने के लिए एक से अधिक पंक्तियां नक्शे के बाद से है। sqlite3 व्युत्पन्न तालिकाओं (मैं अभी तक आवश्यकता पड़ सकती है, तो मैं बंद हाथ पता नहीं है) का समर्थन करता है, तो आप इस और भी संक्षिप्त कर सकते हैं:

select count(*) from (
    select count(*) from t 
    group by foo, bar, baz 
    having count(*) > 1 
) 

यह एक ही पंक्ति परिणाम सेट वापस आ जाएगी, डुप्लिकेट टुपल सेट की संख्या को दर्शाता है। यदि सकारात्मक है, तो आपकी अनुक्रमणिका अद्वितीय नहीं है।

+0

हां है, जो sqlite3 में काम करता है। – finnw

+2

बेशक, यह अभी भी आपको नहीं बताएगा कि सूचकांक डुप्लिकेट की अनुमति देता है लेकिन अभी तक ऐसा नहीं होता है। – finnw

+0

@finnw: आह हाँ, आपके पास एक अच्छा बिंदु है :) – dland

5

के बाद से कोई नहीं का एक अच्छा जवाब के साथ आ, मुझे लगता है कि सबसे अच्छा समाधान यह है:

  • सूचकांक "sqlite_autoindex" के साथ शुरू होता है, यह केवल एक अद्वितीय स्तंभ के लिए एक स्वत: जनरेट सूचकांक है
  • अन्यथा,, टेबल sqlite_master में एसक्यूएल कॉलम में अद्वितीय कीवर्ड के लिए देखने के लिए कुछ इस तरह के साथ:

    चुनें * sqlite_master से जहां type = 'सूचकांक' और SQL की तरह '% अद्वितीय%'

+0

कि पहला बिंदु बिल्कुल सही नहीं है। अगर इंडेक्स "sqlite_autoindex" से शुरू होता है, तो यह प्राथमिक कुंजी के लिए एक ऑटो-जेनरेटेड इंडेक्स है। लेकिन यदि पीके एकाधिक कॉलम है, तो "एकल अद्वितीय स्तंभ" सत्य नहीं है। मेरे यहां मेरे सामने एक है जो एक समग्र पीके है यानी दो कॉलम जो एक साथ अद्वितीय हैं (लेकिन अकेले नहीं हैं)। – MemeDeveloper

1

आप करीब हैं:

1) सूचकांक "sqlite_autoindex" के साथ शुरू होता है, यह प्राथमिक कुंजी के लिए एक स्वत: जनरेट सूचकांक है। हालांकि, यह sqlite_master या sqlite_temp_master टेबल में होगा, इस पर निर्भर करता है कि तालिका अनुक्रमित है या नहीं।

2) आप तालिका नाम और स्तंभों सबस्ट्रिंग unique शामिल के लिए बाहर देखने की जरूरत है, तो आप उपयोग करना चाहते हैं:

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%' 

Create Index

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

  • कोई संबंधित समस्या नहीं^_^