Ошибка "слишком много индексов в таблице" при создании отношений в Microsoft Access 2010
У меня есть tblUsers, который имеет первичный ключ UserID.
UserID используется как внешний ключ во многих таблицах. В таблице он используется как внешний ключ для нескольких полей (например, ObserverID, RecorderID, CheckerID).
Я успешно добавил отношения (с в представлении "отношения" MS Access), где у меня есть псевдонимы таблиц для выполнения нескольких отношений в таблице:
*tblUser.UserID - > 1 для многих -> tblResight.ObserverID
*tblUser_1.UserID - > 1 для многих - > tblResight.CheckerID
после создания около 25 отношений с обеспечением ссылочной целостности, когда я пытаюсь добавить дополнительный, я получаю следующую ошибку:
"операция не выполнена. Есть слишком много индексов в таблице tblUsers'.- Удалите некоторые индексы из таблицы и повторите операцию."
Я запустил код, который нашел здесь и он вернулся, что У меня есть 6 индексов на tblUsers. Я знаю, что существует ограничение в 32 индекса на таблицу.
Я использую GUI отношений неправильно? Создает ли access индекс для обеспечения ссылочной целостности каждый раз, когда я создаю отношения (особенно индексы, которые не появятся при запуске сценария)? Я немного озадачен, любая помощь будет оценена.
4 ответов
хорошо, проведя еще несколько исследований, я думаю, что получил ответ на этот вопрос. По-видимому, это очень распространенный потолок с доступом. Подведу итоги этот пост Я нашел ниже:
каждая таблица может иметь только 32 'ограничения'. Каждый индекс и обеспечение ссылочной целостности (RI) имеет значение для этого 32. MS Access автоматически создает ограничение при выборе принудительного применения RI; этот параметр нельзя отключить.
все snipets код и все Я нашел через google, вернулся, что у меня было шесть индексов на столе (и, следовательно, я запутался). Чего я не находил/не знал, так это того, что мои 25 отношений были подсчитаны против моих 32, потому что я был принужден.
мое решение состояло в том, чтобы отбросить RI в полях "с более низким приоритетом" (мне больно это говорить) и "принудить" его через формы ввода данных.
в принципе, это еще одна причина, по которой я мигрирую из access и в PostgreSQL в ближайшее время.
Если у кого-то есть лучшая работа, я хотел бы здесь. Спасибо.
в вашей таблице есть скрытые индексы, которые были созданы при определении ваших отношений. Имена скрытых индексов начинаются с символа"~". Но найденный код игнорирует скрытые индексы из-за этого выражения:
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
вы можете получить список всех индексов, включая скрытые, со следующим:
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
обратите внимание, что если у вас есть многозначные поля в таблице, каждый из них будет иметь скрытый индекс.
Он довольно старый, но проблема возвращается очень часто, и этот поток приходит первым в поисковых машинах (кто-то сказал мне ;) )
хорошей возможностью преодолеть эту проблему является работа с "вспомогательной таблицей" для ссылки на другие таблицы.
пример: Статьи таблицы связана со многими другими таблицами по разным причинам. Также ей может понадобиться много внешних ключей для себя. Такую таблицу очень часто получают из возможных индексов. У меня также есть три или четыре из них мои самые большие проекты.
чтобы почти удвоить возможные соединения/индексы RI, вы можете работать с вспомогательной таблицей, которая имеет соединение 1: 1 RI с таблицей tblArticle только с уникальным идентификатором в качестве поля. Я называю его так же, а не с shortletter fk перед ним, как я бы сделал обычно. Назовем это tblArticleLinker.
каждая таблица, которая получает внешний ключ от tblArticle, например Order-Position, получает свое соединение от tblArticleLinker. -- >Вы не теряете индекс для всех этих ссылок, только один в Linkertable
единственное, что вы должны убедиться, это то, что вы всегда добавляете ключ к linkertable при сохранении, иначе невозможно использовать запись.
такая таблица - по моему опыту-намного проще в обращении, чем обычный подход к разбиению полей в разных таблицах. В запросах, которые вам не особенно нужны helpertable (иногда запросы быстрее, если вы это делаете), вы можете напрямую ссылаться на таблицу. Он просто не делается автоматически, как обычно.
Tipp: такой же подход можно также использовать для того чтобы убеждаться, что только "выпущенные" записи могут быть использованы потребителем. Или просто использовать в качестве жесткого фильтра. Это помогает преодолеть возможные программные ошибки, которые не следуют логике они должны.