2010-12-27 14 views
7

में रिश्तों को बनाते समय "टेबल पर बहुत अधिक इंडेक्स" त्रुटि है मेरे पास tblUsers हैं जिनके पास UserID की प्राथमिक कुंजी है।माइक्रोसॉफ्ट एक्सेस 2010

उपयोगकर्ता आईडी कई तालिकाओं में एक विदेशी कुंजी के रूप में उपयोग किया जाता है। एक तालिका के भीतर, इसे कई क्षेत्रों के लिए एक विदेशी कुंजी के रूप में उपयोग किया जाता है (उदा। ऑब्जर्वर आईडी, रिकॉर्डर आईडी, चेकर आईडी)।

मैं सफलतापूर्वक (एमएस एक्सेस 'रिश्ता' दृश्य में) के साथ संबंधों को शामिल किया है, जहां मैं मेज उपनाम तालिका के अनुसार कई रिश्तों को क्या करना है:

* tblUser.UserID - कई लोगों के लिए> 1 -> tblResight.ObserverID

* tblUser_1.UserID -> 1 कई लोगों के लिए -> tblResight.CheckerID

रेफेरेंन्शिअल सत्यनिष्ठा के प्रवर्तन, जब मैं एक अतिरिक्त एक जोड़ने की कोशिश के साथ के बारे में 25 रिश्ते बनाने के बाद, मैं निम्नलिखित मिल त्रुटि :

"ऑपरेशन विफल रहा। टेबल 'tblUsers' पर बहुत अधिक अनुक्रमणिका हैं। मेज पर अनुक्रमित में से कुछ को हटा दें और ऑपरेशन फिर कोशिश करें। "

मैं कोड मैं here पाया भाग गया और यह वापस आ रहा tblUsers पर 6 अनुक्रमित। मैं जानता हूँ कि तालिका के अनुसार 32 इंडेक्सों का एक सीमा होती है है।

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

+0

मेरे लिए, 25 रिश्ते हास्यास्पद हैं। यह मुझे लगता है जैसे आपके पास दोहराना क्षेत्र हो सकता है, और इस प्रकार, एक denormalized संरचना। –

उत्तर

8

ठीक है, कुछ और अनुसंधान करने के बाद, मुझे लगता है मैं इस सवाल का जवाब मिल गया लगता है। स्पष्ट रूप से यह पहुंच के साथ एक बहुत ही आम छत है। मैं नीचे this post जोड़ दूंगा:

प्रत्येक तालिका में केवल 32 'बाधाएं' हो सकती हैं। प्रत्येक इंडेक्स और रेफरेंसियल अखंडता (आरआई) के प्रवर्तन इस 32 की ओर गिना जाता है। एमआई एक्सेस स्वचालित रूप से एक बाधा उत्पन्न करता है जब आप आरआई को लागू करने के लिए चुनते हैं; आप इस विकल्प को अक्षम नहीं कर सकते हैं।

Google के माध्यम से मिले सभी कोड स्निपेट और चीजें, लौट आईं कि मेरे पास टेबल पर छः इंडेक्स थे (और इसलिए मैं उलझन में था)। जो मुझे नहीं मिला/पता नहीं था वह था कि मेरे 25 रिश्तों को मेरे 32 के खिलाफ गिना गया था, क्योंकि मैंने आरआई लागू किया था।

मेरा समाधान आरआई को 'निचली प्राथमिकता' फ़ील्ड (इसे मुझे कहने के लिए दर्द होता है) पर छोड़ना था, और डेटा एंट्री फॉर्मों के माध्यम से इसे 'लागू' करना था।

असल में, यह एक और कारण है कि मैं एक्सेस को माइग्रेट कर रहा हूं और जल्द ही PostgreSQL में हूं।

यदि किसी के पास बेहतर काम है, तो मुझे यहां यह पसंद आएगा। धन्यवाद।

+1

इस पोस्ट में आप वास्तव में "इंडेक्स" का मतलब करते समय "बाधाओं" शब्द का उपयोग कर रहे हैं। आरआई छिपे हुए इंडेक्स बनाता है, लेकिन, सामान्य रूप से, अधिकांश तालिकाएं दो या तीन अन्य तालिकाओं से अधिक नहीं होती हैं, इसलिए पीके के साथ, और कहें, 3 विदेशी कुंजी संयम, आपने केवल 4 इंडेक्स का उपयोग किया है, 28 छोड़कर यदि आपके पास एक सारणी है जिसे वास्तव में अनुक्रमित 28 फ़ील्ड की आवश्यकता है, तो मैं सुझाव दूंगा कि आप अपनी संरचना को देखें, जो कि बहुत ही कम हो सकता है। –

+3

@ डेविड-डब्ल्यू-फेंटन: इस बात पर विश्वास करने का कोई कारण नहीं है कि 25+ इंडेक्स होने से एक असामान्य तालिका इंगित होती है। वास्तव में, सामान्य कुंजी बाधाओं के कारण सामान्यीकरण अधिक सूचकांक की ओर जाता है। ओपी में 25 फ़ील्ड वाली एक टेबल हो सकती है जो प्रत्येक विदेशी कुंजी 25 अलग-अलग तालिकाओं में होती है। किसी ऑब्जेक्ट को सपना देखना काफी आसान है जिसमें 25 अलग-अलग, स्वतंत्र गुण हैं जिन्हें सभी को 25 सामान्य सारणी में इंडेक्स के रूप में दर्शाया जा सकता है, बिना "सामान्यीकरण का नुकसान"।यदि ऐसा है, तो आप कैसे सुझाव देंगे कि कोई समस्या से निपटता है? तालिका को दो 1: 1 टेबल में विभाजित करना? एक आदर्श समाधान नहीं है। – ricovox

3

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

If Left(tbl.Name, 4) <> "MSys" Then 

इसके अलावा, आप कुल संख्या की पुष्टि कर सकते हैं:

If Left(tbl.Name, 4) <> "MSys" And Left(tbl.Name, 1) <> "~" Then 

आप इस के लिए उस लाइन को बदलने के द्वारा कर सकता है कि ListIndexes() फ़ंक्शन छिपा अनुक्रमित शामिल तत्काल विंडो में इस कथन से अपनी मेज के लिए इंडेक्सों का:

? CurrentDb.TableDefs("tblUsers").Indexes.Count 
+0

धन्यवाद हंसअप, लेकिन इन सभी ने अभी भी मुझे वही जवाब दिया, छः। कुछ और शोध करने के बाद, मुझे लगता है कि मैंने अपने प्रश्न का उत्तर दिया। – avianattackarmada

0

आप निम्न के साथ छिपा सहित सभी अनुक्रमित की एक सूची प्राप्त कर सकते हैं,:

Sub TableListIndexes(sTableName As String, Optional bPrintFields As Boolean = False) 

    'Print indexes on a table, and fields in each index. 
    'Need to add a reference to Microsoft ADO Ext. [version] for DDL and Security (ADOX). 

    Dim cat As New ADOX.Catalog 
    Dim idxs As ADOX.Indexes 
    Dim idx As ADOX.Index 
    Dim col As ADOX.Column 
    Dim i As Integer 

    Set cat.ActiveConnection = CurrentProject.Connection 
    Set idxs = cat.Tables(sTableName).Indexes 
    For Each idx In idxs 
     Debug.Print i, idx.Name 
     If bPrintFields Then 
      For Each col In idx.Columns 
       Debug.Print , col 
      Next 
     End If 
     i = i + 1 
    Next 

End Sub 

Sub TestTableListIndexes() 
    TableListIndexes "tblProject" 
End Sub 

कौन देता है

0   PrimaryKey 
1   ProjectBusinessUnitID_6D55FF7827CC48648A15A8E576EF02EF 
2   ProjectDivisionID_9CAC7B9D8136467B97F9BAA7217EAC38 
etc 

ध्यान दें कि यदि आप एक तालिका में किसी भी multivalue क्षेत्रों के प्रत्येक होगा एक छिपी हुई अनुक्रमणिका है।

0

यह काफी पुराना है, लेकिन समस्या यह बहुत बार वापस आने और इस धागे खोज मशीनों में पहले आता है (किसी ने मुझसे कहा;))

एक अच्छी संभावना है इस समस्या को दूर करने के लिए के साथ एक "helper- काम करने के लिए है टेबल "अन्य टेबल्स से जोड़ने के लिए।

एक उदाहरण: एक तालिका आलेख विभिन्न कारणों से कई अन्य तालिकाओं से जुड़ा हुआ है। इसके अलावा उसे खुद के लिए बहुत सारी विदेशी कुंजी की आवश्यकता हो सकती है। ऐसी तालिका अक्सर संभावित सूचकांक से बाहर हो जाती है। मेरी सबसे बड़ी परियोजनाओं में मेरे पास तीन या चार भी हैं।

संभावित आरआई जॉइन/इंडेक्स को लगभग दोगुना करने के लिए आप एक सहायक तालिका के साथ काम कर सकते हैं जिसमें 1: 1 आरआई तालिका के रूप में अद्वितीय-पहचानकर्ता के साथ तालिका tblArticle में शामिल हों। मैं इसे इसके सामने शॉर्टलेटर एफके के साथ समान नहीं करता क्योंकि मैं सामान्य रूप से करता हूं। चलिए इसे tblArticleLinker कहते हैं।

प्रत्येक तालिका जो tblArticle से विदेशी कुंजी प्राप्त करती है, उदाहरण के लिए एक ऑर्डर-स्थिति, इसे tblArticleLinker से जुड़ें। -> आप इन सभी लिंक के लिए एक इंडेक्स नहीं खोले हैं, केवल लिंकर्टेबल

केवल एक चीज जो आपको सुनिश्चित करना है, यह है कि आप हमेशा सहेजते समय लिंक करने योग्य की कुंजी जोड़ते हैं, अन्यथा यह नहीं है रिकॉर्ड का उपयोग करने के लिए संभव है।

ऐसी तालिका है - मेरे अनुभव से - विभिन्न तालिकाओं में फ़ील्ड को विभाजित करने के सामान्य दृष्टिकोण की तुलना में संभालना बहुत आसान है। प्रश्नों में आपको विशेष रूप से हेल्परटेबल की आवश्यकता नहीं होती है (यदि आप ऐसा करते हैं तो कभी-कभी क्वेरी तेज होती हैं), आप सीधे तालिका में लिंक कर सकते हैं। यह हमेशा सामान्य रूप से स्वचालित रूप से नहीं किया जाता है।

टिप: यह सुनिश्चित करने के लिए समान दृष्टिकोण का भी उपयोग किया जा सकता है कि उपयोगकर्ता द्वारा केवल "रिलीज़" रिकॉर्ड्स का उपयोग किया जा सकता है। या बस हार्ड-फ़िल्टर के रूप में उपयोग करने के लिए। इससे संभावित सॉफ़्टवेयर-बग को दूर करने में मदद मिलती है जो उन्हें तर्क के अनुरूप नहीं मानते हैं।

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