2010-12-27 27 views
7

ilişkilerini oluştururken "Tabloda çok fazla dizin var" hatası Kullanıcı Kimliğinin birincil anahtarı olan tblUsers var.Microsoft Access'te

UserID, birçok tabloda yabancı anahtar olarak kullanılır. Bir tabloda, çoklu alanlar için yabancı anahtar olarak kullanılır (ör. ObserverID, RecorderID, CheckerID).

başarıyla masanın başına birden ilişkileri yapmak tablo diğer adları olan yerlerde, (MS Access 'İlişki' görünümünde olan) ilişkileri ekledik:

* tblUser.UserID - birçoğuna> 1 -> tblResight.ObserverID

* tblUser_1.UserID - birçoğuna> 1 -> tblResight.CheckerID

Ben ilave bir tane eklemeyi deneyin başvuru bütünlüğü uygulanması, yaklaşık 25 ilişkileri oluşturduktan sonra, aşağıdaki olsun hata :

"İşlem başarısız oldu. 'TblUsers' tablosunda çok fazla dizin var. tablodaki dizin bazı silin ve işlemi yeniden deneyin."

ben here bulundu kod koştum ve ben tblUsers 6 indeksleri. masanın başına 32 endekslerinin bir sınırı vardır biliyoruz sahip olduğunu döndü.

ben ilişki GUI yanlış kullanıyorum? Does erişim başvuru bütünlüğü uygulanması için I (senaryoyu çalıştırdığınızda kadar gelmezdi özellikle endeksler) bir ilişki oluşturmak her zaman? ben tür şaşkın bir dizin yarat herhangi bir yardım gizli endeksler için isimleri "~" karakteri ile başlar.

+0

Bana göre, 25 ilişki saçmadır. Bana yinelenen bir alan ve bu yüzden de denormal bir yapıya sahip olabileceğiniz gibi geliyor. –

cevap

8

Tamam, biraz daha araştırma yaptıktan sonra, ben bu sorunun cevabını buldum. Görünüşe göre bu erişim ile çok yaygın bir tavan. Ben this post özetlemek gerekir aşağıda bulundu: Her tablo sadece 32 'kısıtlamaları' olabilir

. Her indeks ve başvuru bütünlüğünün (RI) uygulanması bu 32'ye doğru sayar. MS Access, RI'yi zorunlu kılmayı seçtiğinizde otomatik olarak bir kısıtlama oluşturur; Bu seçeneği devre dışı bırakamazsınız.

tüm kod snipets ve ben google yoluyla bulunması şeyler

, masaya altı endeksler olduğunu döndü (ve dolayısıyla ben karıştı başlamıştı). Bulmadığım/bilmediğim şey, benim 25 ilişkilerimin 32'ye karşı sayılmamıydı, çünkü UR'im zorlandı. Buna

Çözümümün 'düşük öncelik' alanları RI düşmesi oldu (o söylemek acı) ve veri giriş formları aracılığıyla 'uygulamak' için.

Temelde, bu şimdiye erişimi dışarı göç ve kısa bir süre PostgreSQL içine ediyorum bir neden daha.Herkes etrafında daha iyi bir işi varsa

, bunu Buraya isteriz. Teşekkürler.

Aşağıdaki ile, gizli olanlar dahil tüm endeksler, bir listesini alabilirsiniz
+1

Bu yazıda, aslında "dizinler" anlamına geldiğinde "kısıtlamalar" kelimesini kullanıyor gibi görünüyorsunuz. RI gizli dizinler oluşturur, ancak, genel olarak, çoğu tablo bir çift veya üç diğer tablolar ile ilgili değildir, bu yüzden bir PK ve 3 yabancı anahtar kısıtlamaları ile, sadece 4 endeksleri kullanarak, 28 bırakarak Gerçekten de, indekslenmiş 28 alana ihtiyaç duyan bir tablonuz varsa, yapınıza bakmanızı öneririm, bu da çok iyi bir şekilde denormalize olabilir. –

+3

@ David-W-Fenton: 25'ten fazla indekse sahip olmanın denormalize bir tabloya işaret ettiğini düşünmek için bir sebep yok. Aslında, normalleştirme yabancı anahtar kısıtlamaları nedeniyle DAHA FAZLA dizinlere yol açar. OP, her yabancı anahtar 25 farklı tabloya 25 alanlı bir tabloya sahip olabilir. 25 farklı tabloya endeks olarak gösterilebilecek 25 farklı, bağımsız özelliklere sahip bir nesneyi "normalleşme kaybı" olmaksızın hayal etmek oldukça kolaydır.Eğer durum buysa, sorunun nasıl ele alınacağını nasıl önerirsiniz? Tabloyu iki 1: 1 tabloya bölmek mi? İdeal bir çözüm değil. – ricovox

3

Masanız ilişkilerinizi tanımlarken oluşturulan endeksler gizledi. takdir. Ama kod y olacağını Eğer toplam sayısını doğrulayabilir Ayrıca

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

: Bu o çizgiyi değiştirerek ListIndexes() fonksiyonu gizli dizinleri içerdiğini yapabiliriz

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

: ou bulundu çünkü bu ifadenin gizli endeksleri dikkate almaz Komut penceresi içinde bu deyimi ile tablo için indeksler:

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

HansUp'a teşekkürler, ama hepsi hala aynı cevabı verdi, altı. Daha fazla araştırma yaptıktan sonra, kendi sorumu cevapladığımı düşünüyorum. – avianattackarmada

0

:

0   PrimaryKey 
1   ProjectBusinessUnitID_6D55FF7827CC48648A15A8E576EF02EF 
2   ProjectDivisionID_9CAC7B9D8136467B97F9BAA7217EAC38 
etc 

Not verir

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 

bir tabloda herhangi multivalue alanları varsa her irade olduğunu gizli bir dizin var.)

bu sorunun üstesinden gelmek için iyi bir olasılık "helper- çalışmak olduğunu; (Birisi bana)

0

Oldukça eski, ama sorun çok sık geri gelip Konuyu arama makinelerinde önce gelir Tablo "diğer Tablolara bağlantı.

Bir örnek: Tablo Madde farklı nedenlerle diğer tabloların bir çok bağlantılıdır. Ayrıca kendisi için çok fazla yabancı tuşa ihtiyacı olabilir. Bu tablo, olası endekslerden sık sık çıkar. En büyük projelerimde üç veya dördü de var.

Muhtemel RI Bağlantıları/dizinlerini neredeyse ikiye katlamak için 1: 1 RI değerine sahip bir yardımcı tabloyla çalışabilirsiniz tblArticle tablosuna, Alan olarak Benzersiz Tanımlayıcı ile birlikte katılın. Ben normalde yaptığım gibi önündeki kısaltma fk ile aynı değil. Hadi tblArticleLinker diyelim.

bir Sipariş-pozisyonu almak örneğin, tblArticle gelen yabancı Anahtarı alır Her tablo onun tblArticleLinker katılabilirsiniz. -> Tüm bu bağlantılar için bir dizin yok, sadece Linkertable için bir tane

Emin olmanız gereken tek şey, kaydetme sırasında her zaman linkertable'a ekleyeceğinizdir, aksi halde Kayıt kullanmak mümkün.

Böyle bir tablodur - farklı tablolarda alanları bölmek zamanki yaklaşımından daha işlemek için çok daha kolay - deneyimlerime. Sorgularda özellikle yardımcı olabilir (bazen sorgular daha hızlıdır), doğrudan tabloya bağlanabilir. Her zamanki gibi otomatik olarak yapılmaz.

Tipp: Aynı yaklaşım aynı zamanda sadece "serbest" Kayıtlar kullanıcı tarafından kullanılabileceğini, emin olmak için kullanılabilir. Ya da sadece bir Sabit Filtre olarak kullanmak. Bu, gereken mantığı takip etmeyen olası Yazılım Hatalarının üstesinden gelmeye yardımcı olur.