Primary key beim MySqlBulkLoader

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Holistiker.

    Primary key beim MySqlBulkLoader

    Hallöchen,

    ich habe eine ziemlich einfache MySql Datenbank. (Ich vereinfache mal die Anzahl der Spalten)

    Tabelle1 = "tbl_bestellnummern" mit den Spalten ( Bestellnummer(Primary-Key), Warentarifnummer )
    Tabelle2 = "tbl_preise" mit den Spalten (id (Primary-Key), Bestellnummer , Lieferant , Preis)

    Ich denke das ist so ziemlich eindeutig wie die beiden Tabellen in Beziehung zu einander stehen.

    Die Daten werden aktuell per Bulkloader in die Tabellen geschoben. Das sieht dann in etwa so aus:

    VB.NET-Quellcode

    1. Dim cols As String() = {"Bestellnummer", "Lieferant", "Preis"}
    2. Dim myfile As String = "C:\Users\MTK\Desktop\preise.csv"
    3. Dim rows As Integer = 0
    4. Using con2 As New MySqlConnection(sqlconnectionstring)
    5. Dim bulkloader = New MySqlBulkLoader(con2)
    6. bulkloader.TableName = "tbl_preise"
    7. bulkloader.FieldTerminator = ";"
    8. bulkloader.LineTerminator = "\r\n"
    9. bulkloader.FileName = myfile
    10. bulkloader.NumberOfLinesToSkip = 1
    11. 'bulkloader.ConflictOption = MySql.Data.MySqlClient.MySqlBulkLoaderConflictOption.Replace
    12. bulkloader.Columns.Clear()
    13. For Each s In cols
    14. bulkloader.Columns.Add(s)
    15. Next
    16. rows = bulkloader.Load()
    17. End Using



    Das klappt alles rasend schnell und die aktuell 85000 Datensätze sind in unter 1 Sekunde in der Tabelle :thumbsup: .

    Jetzt aber zum Problem:

    Wenn ich zukünftig die Daten in der "tbl_Preise" updaten will ( dazu wird es einfach immer eine neue Datei geben ) dann zählt mysql natürlich automatisch die "id" weiter hoch weil diese auf Autoincrement steht.
    Heißt: Mit jedem Upload, verdoppel ich auch die Anzahl der Datensätze.

    In der ersten Tabelle "tbl_bestellnummern" ist dies noch egal, weil hier jede Bestellnummer eh nur einmal vorkommt und ich mittels -> "bulkloader.ConflictOption = MySql.Data.MySqlClient.MySqlBulkLoaderConflictOption.Replace" den Primärschlüssel ja auch auch schon habe und es somit auch keine Verdopplung sondern ein Update gibt.

    Bei der 2ten Tabelle stehe ich jetzt ein wenig auf dem Schlauch. Ich möchte nämlich gerne die Performance vom Bulkloader behalten und trotzdem ein Update machen können aber mit Selektion auf die Bestellnummer, da ich die id ja nicht kenne. Quasi:

    bulkloader.load where tbl_preise.Bestellnummer=MyFile.Bestellnummer (Ich hoffe die Darstellung ist klar)

    Geht das überhaupt mit dem Bulkloader?

    Danke :)
    Nur zur Info, damit der Thread hier nicht unbeantwortet im Nirvana versinkt obwohl ich das Problem inzwischen "umgehen" konnte:

    Da es sich hier um 2 Tabellen handelt die auch unabhängig voneinander behandelt werden können, ohne dass ich zwangsläufig eine Beziehung zueinander aufbauen muss, habe ich hier jetzt ("Bitte steinigt mich nicht") das Autoincrement weggenommen und den Index selber über "Bestellnummer.Lieferantennummer" gebildet.

    Da dieser Wert zu 99,99 % nur einmal vorkommen darf, kann ich so über den Bulkloader auch Updates fahren, da neue Werte(Indexe) hinzugefügt und bestehende aktualisiert werden.