我有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是错误的吗?在我创建关系时,访问是否为执行引用完整性创建索引(特别是在运行脚本时不会出现的索引)?我有点困惑,任何帮助都会受到赞赏。
答案 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;用户可以使用记录。或者只是用作硬过滤器。这有助于克服可能的软件错误,这些错误不符合他们应该遵循的逻辑。