Tabellen - Index erstellen

Wie kann ich einen Index setzen?

Sie können für eine Tabelle einen oder mehrere Indizes erstellen – entweder sofort nach dem Anlegen der Tabelle oder zu einem späteren Zeitpunkt.

Es ist üblich, beim Anlegen einer Tabelle, ein Feld oder eine Zusammensetzung aus mehreren Feldern mit einem eindeutigen Index, dem so genannten Primärschlüssel, zu versehen, der fortan die Standardordnung über die Tabelle verkörpert.

Da ein Primärschlüssel laut Definition ein eindeutiger Index sein muss, kann man sich die Frage stellen, was der Unterschied zwischen den Eigenschaften Primary und Unique ist.

Der wesentliche Unterschied besteht darin, dass ein Primärschlüssel unter keinen Umständen Nullwerte erlaubt, während ein Index mit auf True gesetzter Eigenschaft Unique in Kombination einer auf True gesetzten Eigenschaft IgnoreNulls Nullwerte akzeptiert, indem er sie ignoriert.

Die nachstehenden Beispiele zeigen Ihnen eine Möglichkeit, sowohl einen Primärschlüssel, als auch nur Indizes mit Duplikate bzw. ohne Duplikate zu hinterlegen.

DAO-Variante

Beispiel:

Public Function DAO_CreateIndex(pdbs As DAO.Database, _
                                       psTable As String, _
                                       psField As String, _
                                       pbPrimary As Boolean, _
                                       pbUnique As Boolean, _
                                       Optional psIDXName _
                                       As String = vbNullString) _
                                       As Boolean
  On Error GoTo HandleErr
 
  '// Benötigte Objektvaribalen
  Dim tdef As DAO.TableDef
  Dim tfld As DAO.Field
  Dim tidx As DAO.Index
 
  '// Zuweisung der Tabelle
  Set tdef = pdbs.TableDefs(psTable)
  '// Index erstellen
  Set tidx = tdef.CreateIndex
 
  With tidx
    '// falls angegeben Indexname
    If Len(psIDXName) > 0 Then
        .Name = psIDXName
    Else
        .Name = psField
    End If
    '// falls angegeben, Primary-Eigenschaft setzen
    If pbPrimary Then tidx.Primary = True
    '// Unique-Eigenschaft (Eindeutigkeit) setzen
    .Unique = pbUnique
    '// Index für das Feld festlegen
    Set tfld = .CreateField(psField)
    '// Index für das Feld übernehmen
    .Fields.Append tfld
  End With
 
  '// Index in der Auflistung übernehmen
  tdef.Indexes.Append tidx
  '// Auflistung aktualisieren
  tdef.Indexes.Refresh
 
  '// Erfolgreich
  DAO_CreateIndex = True
 
HandleExit:
  '// Speicher freigeben
  If Not tfld Is Nothing Then Set tfld = Nothing
  If Not tidx Is Nothing Then Set tidx = Nothing
  If Not tdef Is Nothing Then Set tdef = Nothing
  Exit Function
 
HandleErr:
  Select Case Err.Number
    Case Else
      MsgBox "Fehler " & Err.Number & ": " & _
             Err.Description, vbCritical, _
             "modKap03.DAO_CreateIndex"
  End Select
  DAO_CreateIndex = False
  Resume HandleExit
End Function
ADOX-Variante

Beispiel:

Public Function ADO_CreateIndex(pcnn As ADODB.Connection, _
                                psTable As String, _
                                psField As String, _
                                pfBPrimary As Boolean, _
                                pfBUnique As Boolean, _
                                Optional psIDXName As String = vbNullString) _
                                As Boolean
 
  On Error GoTo HandleErr
 
  '// Benötigte Objektvaribalen
  Dim cat As New ADOX.Catalog
  Dim tbl As ADOX.Table
  Dim col As ADOX.Column
  Dim idx As ADOX.Index
 
  cat.ActiveConnection = pcnn
 
  '// Zuweisung der Tabelle
  Set tbl = cat.Tables(psTable)
 
  '// Index erstellen
  Set idx = New Index
  With idx
    '// falls angegeben Indexname
    If Len(psIDXName) > 0 Then
      .Name = psIDXName
    Else
      .Name = psField
    End If
    '// falls angegeben, Primary-Eigenschaft setzen
    If pfBPrimary Then
      .IndexNulls = adIndexNullsDisallow
    Else
      .IndexNulls = adIndexNullsAllow
    End If
    If pfBPrimary Then
      .PrimaryKey = pfBPrimary
    End If
    '// Unique-Eigenschaft (Eindeutigkeit) setzen
    .Unique = pfBUnique
 
    '// Index für das Feld festlegen
    Set col = New Column
    col.Name = psField
    '// Index für das Feld übernehmen
    .Columns.Append col
    '// Index in der Auflistung übernehmen
    tbl.Indexes.Append idx
  End With
  ADO_CreateIndex = True
 
HandleExit:
  '// Speicher freigeben
  If Not idx Is Nothing Then Set idx = Nothing
  If Not col Is Nothing Then Set col = Nothing
  If Not tbl Is Nothing Then Set tbl = Nothing
  If Not cat Is Nothing Then Set cat = Nothing
  Exit Function
 
HandleErr:
  Select Case Err.Number
    Case Else
      MsgBox "Fehler " & Err.Number & ": " & _
             Err.Description, vbCritical, _
             "modKap03.ADO_CreateIndex"
  End Select
  ADO_CreateIndex = False
  Resume HandleExit
End Function
SQL-DLL-Variante

Beispiel:

' DAO-Variante
Public Function DDL_CreateIndexDAO(pdbs As DAO.Database, _
                                       psTable As String, _
                                       psField As String, _
                                       pfBPrimary As Boolean, _
                                       pfBUnique As Boolean, _
                                       Optional psIDXName _
                                       As String = vbNullString) _
                                       As Boolean
  On Error GoTo HandleErr
  Dim sSQL As String
 
  sSQL = "Create "
  '// falls angegeben, Unique-Eigenschaft (Eindeutigkeit) setzen
  If pfBUnique And Not pfBPrimary Then
    sSQL = sSQL & "UNIQUE "
  End If
  sSQL = sSQL & "INDEX "
 
  '// falls angegeben Indexname
  If Len(psIDXName) > 0 Then
    sSQL = sSQL & psIDXName
  Else
    sSQL = sSQL & psField
  End If
 
  sSQL = sSQL & " ON " & psTable & " (" & psField & ")"
 
  '// falls angegeben, Primary-Eigenschaft setzen
  If pfBPrimary Then
    sSQL = sSQL & " WITH PRIMARY"
  End If
 
  '// Index erstellen
  pdbs.Execute sSQL, dbFailOnError
  DDL_CreateIndexDAO = True
 
HandleExit:
  Exit Function
 
HandleErr:
  Select Case Err.Number
    Case Else
      MsgBox "Fehler " & Err.Number & ": " & _
             Err.Description, vbCritical, _
             "modKap03.DDL_CreateIndexDAO"
  End Select
  DDL_CreateIndexDAO = False
  Resume HandleExit
End Function
 
' ADO-Variante
Public Function DDL_CreateIndexADO(pcnn As ADODB.Connection, _
                                   psTable As String, _
                                   psField As String, _
                                   pfBPrimary As Boolean, _
                                   pfBUnique As Boolean, _
                                   Optional psIDXName _
                                   As String = vbNullString) _
                                   As Boolean
    On Error GoTo HandleErr
    Dim sSQL As String
 
    sSQL = "Create "
    '// falls angegeben, Unique-Eigenschaft (Eindeutigkeit) setzen
    If pfBUnique And Not pfBPrimary Then
        sSQL = sSQL & "UNIQUE "
    End If
    sSQL = sSQL & "INDEX "
 
    '// falls angegeben Indexname
    If Len(psIDXName) > 0 Then
        sSQL = sSQL & psIDXName
    Else
        sSQL = sSQL & psField
    End If
 
    sSQL = sSQL & " ON " & psTable & " (" & psField & ")"
 
    '// falls angegeben, Primary-Eigenschaft setzen
    If pfBPrimary Then
        sSQL = sSQL & " WITH PRIMARY"
    End If
 
    '// Index erstellen
    pcnn.Execute sSQL, dbFailOnError
    DDL_CreateIndexADO = True
 
HandleExit:
    Exit Function
 
HandleErr:
    Select Case Err.Number
        Case Else
            MsgBox "Fehler " & Err.Number & ": " & _
                   Err.Description, vbCritical, _
                   "modKap03.DDL_CreateIndexADO"
    End Select
    DDL_CreateIndexADO = False
    Resume HandleExit
End Function