Объект Index (DAO)

Область применения: Access 2013, Office 2013

Объекты индекса определяют порядок записей, к которые обращаются из таблиц базы данных, и указывают, принимаются ли дубликаты записей, обеспечивая эффективный доступ к данным. Для внешних баз данных объекты Index описывают индексы, установленные для внешних таблиц (только для рабочих областей Microsoft Access).

Замечания

Ядро СУБД Microsoft Access использует индексы при соединении таблиц и создании объектов Recordset . Индексы определяют порядок, в котором объекты Recordset табличного типа возвращают записи, но не определяют порядок, в котором ядро СУБД Microsoft Access хранит записи в базовой таблице, или порядок, в котором любой другой тип объекта Recordset возвращает записи.

С помощью объекта Index можно:

  • Используйте свойство Required , чтобы определить, требуются ли для объектов Field в индексе значения, не равные NULL, а затем используйте свойство IgnoreNulls , чтобы определить, содержат ли значения NULL записи индекса.

  • Используйте свойства Primary и Unique , чтобы определить порядок и уникальность объекта Index .

Ядро СУБД Microsoft Access автоматически поддерживает все базовые индексы таблицы. Он обновляет индексы при каждом добавлении, изменении или удалении записей из базовой таблицы. После создания базы данных периодически используйте метод CompactDatabase для обновления статистики индексов.

При доступе к объекту Recordset табличного типа укажите порядок записей с помощью свойства Index объекта. Задайте для этого свойства значение Свойства Name существующего объекта Index в коллекции Indexes . Эта коллекция содержится в объекте TableDef , лежащем в основе заполняемого объекта Recordset .

Примечание.

Вам не нужно создавать индексы для таблицы, но для больших неиндексированных таблиц доступ к определенной записи или обработка соединений может занять много времени. И наоборот, слишком большое количество индексов может замедлить обновление базы данных по мере внесения изменений в каждый из индексов таблицы.

Свойство Attributes каждого объекта Field в индексе определяет порядок возвращаемых записей и, следовательно, определяет, какие методы доступа следует использовать для этого индекса.

Каждый объект Field в коллекции Fields объекта Index является компонентом индекса. Чтобы определить новый объект Index , задайте его свойства перед добавлением его в коллекцию, чтобы сделать объект Index доступным для последующего использования.

Примечание.

Изменить параметр свойства Name существующего объекта Index можно только в том случае, если параметр обновляемого свойства содержащего объекта TableDef имеет значение True.

При установке первичного ключа для таблицы ядро СУБД Microsoft Access автоматически определяет его в качестве первичного индекса. Основной индекс состоит из одного или нескольких полей, которые однозначно определяют все записи в таблице в предопределенном порядке. Так как поле первичного индекса должно быть уникальным, ядро СУБД Microsoft Access автоматически устанавливает для свойства Unique основного объекта Indexзначение True. Если основной индекс состоит из нескольких полей, каждое поле может содержать повторяющиеся значения, но сочетание значений из всех индексированных полей должно быть уникальным. Первичный индекс состоит из ключа для таблицы и всегда состоит из того же поля, что и первичный ключ.

Важно!

Убедитесь, что данные соответствуют атрибутам нового индекса. Если для индекса требуются уникальные значения, убедитесь, что в существующих записях данных нет дубликатов. Если дубликаты существуют, ядро СУБД Microsoft Access не может создать индекс. При попытке использовать метод Append в новом индексе возникает ошибка, допускаемая в ловушку.

При создании связи, которая обеспечивает целостность ссылок, ядро СУБД Microsoft Access автоматически создает индекс со свойством Foreign , заданным в качестве внешнего ключа в таблице ссылок. После установления связи между таблицами ядро СУБД Microsoft Access предотвращает добавление или изменение базы данных, которые нарушают эту связь. Если для свойства Attributes объекта Relation задано разрешение каскадных обновлений и каскадных удалений, ядро СУБД Microsoft Access автоматически обновляет или удаляет записи в связанных таблицах.

  1. Используйте метод CreateIndex для объекта TableDef .

  2. Используйте метод CreateField в объекте Index , чтобы создать объект Field для каждого поля (столбца), включаемого в объект Index .

  3. Задайте свойства индекса по мере необходимости.

  4. Добавьте объект Field в коллекцию Fields .

  5. Добавьте объект Index в коллекцию Indexes .

    Примечание.

    Свойство Clustered игнорируется для баз данных, использующих ядро СУБД Microsoft Access, которое не поддерживает кластеризованные индексы.

Пример

В этом примере создается новый объект Index , он добавляется в коллекцию Indexes объекта Employees TableDef, а затем перечисляется коллекция Indexesобъекта TableDef. Наконец, он перечисляет набор записей, сначала используя первичный индекс, а затем с помощью нового индекса. Для выполнения этой процедуры требуется процедура IndexOutput.

    Sub IndexObjectX() 
     
     Dim dbsNorthwind As Database 
     Dim tdfEmployees As TableDef 
     Dim idxNew As Index 
     Dim idxLoop As Index 
     Dim rstEmployees As Recordset 
     
     Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     Set tdfEmployees = dbsNorthwind!Employees 
     
     With tdfEmployees 
     ' Create new index, create and append Field 
     ' objects to its Fields collection. 
     Set idxNew = .CreateIndex("NewIndex") 
     
     With idxNew 
     .Fields.Append .CreateField("Country") 
     .Fields.Append .CreateField("LastName") 
     .Fields.Append .CreateField("FirstName") 
     End With 
     
     ' Add new Index object to the Indexes collection 
     ' of the Employees table collection. 
     .Indexes.Append idxNew 
     .Indexes.Refresh 
     
     Debug.Print .Indexes.Count & " Indexes in " & _ 
     .Name & " TableDef" 
     
     ' Enumerate Indexes collection of Employees 
     ' table. 
     For Each idxLoop In .Indexes 
     Debug.Print " " & idxLoop.Name 
     Next idxLoop 
     
     Set rstEmployees = _ 
     dbsNorthwind.OpenRecordset("Employees") 
     
     ' Print report using old and new indexes. 
     IndexOutput rstEmployees, "PrimaryKey" 
     IndexOutput rstEmployees, idxNew.Name 
     rstEmployees.Close 
     
     ' Delete new Index because this is a 
     ' demonstration. 
     .Indexes.Delete idxNew.Name 
     End With 
     
     dbsNorthwind.Close 
     
    End Sub 
     
    Sub IndexOutput(rstTemp As Recordset, _ 
     strIndex As String) 
     ' Report function for FieldX. 
     
     With rstTemp 
     ' Set the index. 
     .Index = strIndex 
     .MoveFirst 
     Debug.Print "Recordset = " & .Name & _ 
     ", Index = " & .Index 
     Debug.Print " EmployeeID - Country - Name" 
     
     ' Enumerate the recordset using the specified 
     ' index. 
     Do While Not .EOF 
     Debug.Print " " & !EmployeeID & " - " & _ 
     !Country & " - " & !LastName & ", " & !FirstName 
     .MoveNext 
     Loop 
     
     End With 
     
    End Sub 

В этом примере метод CreateIndex используется для создания двух новых объектов Index , а затем добавляет их в коллекцию Indexes объекта Employees TableDef . Затем он перечисляет коллекцию Indexes объекта TableDef , коллекцию Fields новых объектов Index и коллекцию Properties новых объектов Index . Для выполнения этой процедуры требуется функция CreateIndexOutput.

    Sub CreateIndexX() 
     
     Dim dbsNorthwind As Database 
     Dim tdfEmployees As TableDef 
     Dim idxCountry As Index 
     Dim idxFirstName As Index 
     Dim idxLoop As Index 
     
     Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     Set tdfEmployees = dbsNorthwind!Employees 
     
     With tdfEmployees 
     ' Create first Index object, create and append Field 
     ' objects to the Index object, and then append the 
     ' Index object to the Indexes collection of the 
     ' TableDef. 
     Set idxCountry = .CreateIndex("CountryIndex") 
     With idxCountry 
     .Fields.Append .CreateField("Country") 
     .Fields.Append .CreateField("LastName") 
     .Fields.Append .CreateField("FirstName") 
     End With 
     .Indexes.Append idxCountry 
     
     ' Create second Index object, create and append Field 
     ' objects to the Index object, and then append the 
     ' Index object to the Indexes collection of the 
     ' TableDef. 
     Set idxFirstName = .CreateIndex 
     With idxFirstName 
     .Name = "FirstNameIndex" 
     .Fields.Append .CreateField("FirstName") 
     .Fields.Append .CreateField("LastName") 
     End With 
     .Indexes.Append idxFirstName 
     
     ' Refresh collection so that you can access new Index 
     ' objects. 
     .Indexes.Refresh 
     
     Debug.Print .Indexes.Count & " Indexes in " & _ 
     .Name & " TableDef" 
     
     ' Enumerate Indexes collection. 
     For Each idxLoop In .Indexes 
     Debug.Print " " & idxLoop.Name 
     Next idxLoop 
     
     ' Print report. 
     CreateIndexOutput idxCountry 
     CreateIndexOutput idxFirstName 
     
     ' Delete new Index objects because this is a 
     ' demonstration. 
     .Indexes.Delete idxCountry.Name 
     .Indexes.Delete idxFirstName.Name 
     End With 
     
     dbsNorthwind.Close 
     
    End Sub 
     
    Function CreateIndexOutput(idxTemp As Index) 
     
     Dim fldLoop As Field 
     Dim prpLoop As Property 
     
     With idxTemp 
     ' Enumerate Fields collection of Index object. 
     Debug.Print "Fields in " & .Name 
     For Each fldLoop In .Fields 
     Debug.Print " " & fldLoop.Name 
     Next fldLoop 
     
     ' Enumerate Properties collection of Index object. 
     Debug.Print "Properties of " & .Name 
     For Each prpLoop In .Properties 
     Debug.Print " " & prpLoop.Name & " - " & _ 
     IIf(prpLoop = "", "[empty]", prpLoop) 
     Next prpLoop 
     End With 
     
    End Function