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.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert