在Microsoft Access 2010中创建关系时“表上的索引太多”错误

时间:2010-12-27 23:13:37

标签: ms-access relationship indexing

我有tblUsers,其主键是UserID。

UserID在许多表中用作外键。在表中,它用作多个字段的外键(例如ObserverID,RecorderID,CheckerID)。

我已经成功添加了关系(在MS Access'关系'视图中),我有表别名来执行每个表的多个关系:

* tblUser.UserID - > 1对多 - > tblResight.ObserverID

* tblUser_1.UserID - > 1对多 - > tblResight.CheckerID

在执行参照完整性后创建了大约25个关系后,当我尝试添加另一个时,我收到以下错误:

“操作失败。表'tblUsers上的索引太多了。'删除表上的一些索引并再次尝试操作。“

我运行了我找到的代码here,它返回我在tblUsers上有6个索引。我知道每个表有32个索引的限制。

我使用关系GUI是错误的吗?在我创建关系时,访问是否为执行引用完整性创建索引(特别是在运行脚本时不会出现的索引)?我有点困惑,任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:10)

好的,经过一些研究,我想我得到了这个问题的答案。显然,这是一个非常普通的天花板,可以访问。我总结一下this post我发现如下:

每个表只能有32个'约束'。参考完整性(RI)的每个索引和强制执行都计入此32.当您选择强制执行RI时,MS Access会自动创建约束。你不能禁用这个选项。

我通过谷歌找到的所有代码snipets和东西,返回我在桌面上有六个索引(因此我感到困惑)。我没有发现/不知道的是我的25个关系被计算在我的32岁之间,因为我强制执行了RI。

我的解决方法是将RI放在“较低优先级”字段上(这让我很难说),并通过数据输入表单“强制”它。

基本上,这是我即将迁移出访问并进入PostgreSQL的另一个原因。

如果有人有更好的工作,我很乐意在这里。感谢。

答案 1 :(得分:3)

您的表具有隐藏的索引,这些索引是在您定义关系时创建的。隐藏索引的名称以“〜”字符开头。但是你发现的代码忽略了隐藏的索引,因为这个表达式:

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

您可以通过将该行更改为此来使ListIndexes()函数包含隐藏索引:

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

此外,您可以在立即窗口中使用此语句验证表的索引总数:

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

答案 2 :(得分: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

请注意,如果表中有任何多值字段,则每个字段都有一个隐藏索引。

答案 3 :(得分:0)

它已经很老了,但问题很常见,这个帖子在搜索机器中首先出现(有人告诉我;)

克服这个问题的一个很好的可能性是使用&#34; helper-Table&#34;链接到其他表。

一个例子: 由于不同的原因,表文章链接到许多其他表。此外,她可能需要很多外键。这样的表经常出于可能的索引。在我最大的项目中,我也有三到四个。

要使可能的RI连接/索引几乎加倍,您可以使用具有1:1 RI的辅助表连接到表tblArticle,只使用Unique-Identifier作为Field。我的确如此命名,而不是像我通常那样使用前面的短信fk。我们称之为tblArticleLinker。

从tblArticle获取外键的每个表(例如Order-Position)都从tblArticleLinker获取其连接。 - &GT;您不会丢失所有这些链接的索引,只有一个链接到Linkertable

您唯一需要确保的是,您在保存时始终将密钥添加到linkertable,否则无法使用记录。

根据我的经验,这样的表比分割不同表中的字段的通常方法更容易处理。在查询中,您并不特别需要helpertable(如果您这样做,有时查询会更快),您可以直接链接到表。它不是像往常一样自动完成的。

Tipp:同样的方法也可以用来确保,只有&#34;释放&#34;用户可以使用记录。或者只是用作硬过滤器。这有助于克服可能的软件错误,这些错误不符合他们应该遵循的逻辑。