#sql #database #ms-access
#sql #База данных #ms-access
Вопрос:
Возможно ли добавить индекс в представление Ms Access?
Я пытаюсь выполнить этот запрос:
CREATE INDEX MyCustomViewIndex ON [MyView] (MyColumn) WITH DISALLOW NULL
и я получаю это сообщение об ошибке.
Не удается выполнить инструкции определения данных в связанных источниках данных.
Есть предложения?
С уважением, Алекс
Редактировать:
Определение моего представления:
create view MyView as SELECT TableA.Field1, MyUnionQuery.Field2
FROM TableA, MyUnionQuery
Определение MyUnionQuery:
Select * from ViewX
UNION select * from ViewY
Все таблицы находятся в одном файле MDB
Комментарии:
1. Где хранится ваша связанная таблица? Другой mdb, SQL Server, какой-то другой серверной части?
2. все задействованные таблицы и представления находятся в одном файле mdb
3. Как вы думаете, почему решение заключается в индексации представления, а не базовой таблицы, из которой представление извлекает свои данные?
Ответ №1:
Как обычно для Access (ACE, Jet, что угодно), документация расплывчата: в ней говорится о «таблицах», и, конечно, VIEW
это «просматриваемая таблица», но я думаю, что в данном случае это конкретно относится к «базовым таблицам». Я сильно подозреваю, что индексы не поддерживаются для Access VIEW
-ов.
Когда я пытаюсь создать его с помощью SQL DDL, я тоже получаю сообщение об ошибке «Не удается выполнить инструкции определения данных в связанных источниках данных». Вот некоторый код VBA для воспроизведения ошибки (создает новый .mdb во временной папке, ссылки не требуются, просто вставьте в модуль кода VBA, например, в Excel):
Sub NoIndexedViews()
On Error Resume Next
Kill Environ$("temp") amp; "DropMe.mdb"
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" amp; _
"Data Source=" amp; _
Environ$("temp") amp; "DropMe.mdb"
With .ActiveConnection
Dim Sql As String
Sql = _
"CREATE TABLE T (col1 INTEGER);"
.Execute Sql
Sql = _
"CREATE VIEW V (col1) AS SELECT col1 FROM T;"
.Execute Sql
On Error Resume Next
Sql = _
"CREATE INDEX idx ON V (col1) WITH DISALLOW NULL"
.Execute Sql
MsgBox Err.Description
End With
Set .ActiveConnection = Nothing
End With
End Sub
У меня нет каких-либо связанных источников данных в моем .mdb, поэтому я делаю вывод, что отображаемая ошибка является ложной и вводит в заблуждение. Но факт остается фактом, индекс не может быть создан в Access VIEW
.
Комментарии:
1. Я думаю, что возможно создавать временные индексы в наборах записей ADO, но я могу ошибаться в этом. Я вспоминаю длинную дискуссию в одной из групп новостей Access по этому поводу, где кто-то закодировал то же самое в DAO с использованием транзакций.
2. @David-W-Fenton: Да, вы имеете в виду свойство Оптимизировать поле набора записей. Это используется для ускорения вызовов методов поиска и фильтрации набора записей. Однако обратите внимание, что OP пытается создать
NOT NULL
ограничение дляVIEW
(он же объект запроса).3. Я не понимаю, почему вы не хотели бы, чтобы этот индекс, который запрещает значения Null, находился в базовом поле, а не в ПРЕДСТАВЛЕНИИ. Если это необходимо для ПРЕДСТАВЛЕНИЯ, почему это также не было бы необходимо в базовой таблице?
Ответ №2:
Согласно сообщению об ошибке, это связанный источник данных. Это означает, что таблица находится не внутри access, а связана внутри.
Поскольку Access не управляет таблицей, он не может выполнить запрошенную операцию.
Где находится таблица, из которой поступают данные?
Комментарии:
1. все объекты находятся в одном файле MDB