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