Das „#Gelöscht“-Problem bei BIGINT-Feldern beheben
Die Kombination aus Microsoft Access als Frontend und MySQL oder MariaDB als Backend ist in vielen kleinen bis mittleren IT-Projekten nach wie vor beliebt – insbesondere für interne Tools, schnelle Formulareingaben oder Berichte.
Die Verbindung über einen ODBC-DSN ist dabei schnell eingerichtet. Doch bei der Verwendung von BIGINT-Spalten in MySQL kann es in Access zu einem merkwürdigen Verhalten kommen: Alle Zeilen einer verknüpften Tabelle erscheinen als „#Gelöscht“ – obwohl die Daten korrekt vorhanden sind.
Das Problem: „#Gelöscht“ bei BIGINT-Spalten
Access zeigt Datensätze als „#Gelöscht“, wenn es die Datentypen der verknüpften Tabelle nicht korrekt interpretieren kann – besonders kritisch wird es bei Spalten vom Typ BIGINT, da Access intern keine native Unterstützung für 64-Bit-Ganzzahlen hat.
Selbst wenn im ODBC-Treiber (z. B. MySQL Connector/ODBC 8.3) die Option „BIGINT als INT behandeln“ aktiviert ist, kann Access beim Verknüpfen die Datenstruktur falsch interpretieren – insbesondere, wenn das BIGINT-Feld als Primärschlüssel fungiert.
Die Lösung: BIGINT-Spalten in INT umwandeln
In vielen Fällen reicht der Wertebereich eines INT UNSIGNED völlig aus (bis ~4 Milliarden) – daher kann man BIGINT-Spalten sicher nach INT umwandeln, wenn man vorher prüft, ob keine übergroßen Werte vorkommen.
Um das zu vereinfachen, habe ich eine VBA-Funktion für Access geschrieben, mit der man gezielt die BIGINT-Spalten einer bestimmten MySQL-Tabelle per Pass-Through-Query umwandeln kann – direkt aus Access heraus.
Die Funktion: WandleBIGINTSpaltenNachINT
Public Sub WandleBIGINTSpaltenNachINT(DSN As String, Tabelle As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Dim sql As String
Dim alterSQL As String
Dim spalte As String, nullable As String, defVal As Variant
Set db = CurrentDb
' BIGINT-Spalten abfragen per temp. Pass-Through-Query
Set qdf = db.CreateQueryDef("")
qdf.Connect = "ODBC;DSN=" & DSN & ";"
qdf.SQL = "SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT, EXTRA " & _
"FROM information_schema.COLUMNS " & _
"WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" & Tabelle & "' AND DATA_TYPE = 'bigint'"
qdf.ReturnsRecords = True
Set rs = qdf.OpenRecordset(dbOpenSnapshot)
Do While Not rs.EOF
spalte = rs!COLUMN_NAME
nullable = rs!IS_NULLABLE
defVal = rs!COLUMN_DEFAULT
alterSQL = "ALTER TABLE `" & Tabelle & "` MODIFY COLUMN `" & spalte & "` INT UNSIGNED"
If nullable = "NO" Then alterSQL = alterSQL & " NOT NULL"
If Not IsNull(defVal) Then
alterSQL = alterSQL & " DEFAULT " & FormatDefaultValue(defVal)
End If
If rs!EXTRA = "auto_increment" Then
alterSQL = alterSQL & " AUTO_INCREMENT"
End If
alterSQL = alterSQL & ";"
Debug.Print "⚙️ " & alterSQL
' Ausführen als temp. Pass-Through-Query
Set qdf = db.CreateQueryDef("")
qdf.Connect = "ODBC;DSN=" & DSN & ";"
qdf.SQL = alterSQL
qdf.ReturnsRecords = False
qdf.Execute dbFailOnError
Debug.Print "✅ Umgewandelt: " & Tabelle & "." & spalte
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub
Private Function FormatDefaultValue(val As Variant) As String
If IsNumeric(val) Then
FormatDefaultValue = val
Else
FormatDefaultValue = "'" & Replace(val, "'", "''") & "'"
End If
End Function
So wendest du die Funktion an:
Call WandleBIGINTSpaltenNachINT("MeinDSN", "wp_posts")
Das Beispiel wandelt alle BIGINT-Spalten in der Tabelle wp_posts nach INT – inklusive NOT NULL und Defaultwerten, soweit vorhanden.
Wer Access mit MySQL oder MariaDB nutzt, sollte BIGINT-Spalten mit Bedacht einsetzen. Das „#Gelöscht“-Problem lässt sich mit einem gezielten Umwandlungsskript schnell lösen – besonders bei WordPress-Datenbanken, wo BIGINT sehr häufig vorkommt.
💡 Tipp: Für noch mehr Automatisierung kann man das Skript so erweitern, dass es alle Tabellen einer Datenbank durchläuft und alle BIGINT-Spalten automatisch konvertiert.
No responses yet