InnoDB auto_increment Problem?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • InnoDB auto_increment Problem?

    Hallo,

    hat jemand eine Lösung für das Problem mit dem auto_increment und InnoDB?

    Wenn ich einen Datensatz in einer Tabelle speichern will und dieser schief läuft oder ich diesen mit einem Rollback abbreche, erhöht sich dennoch der auto_increment-Wert des Primärschlüssels. Das kann doch nicht wahr sein!

    Das Problem hatte ich vor 2 Jahren schon mal, und hatte nun gehofft das MySQL das endlich mal gefixt hat, aber nix ist!

    Jemand eine Idee, wie ich das Problem umgehen kann?

    Danke!

  • #2
    Zitat von TriphunEM Beitrag anzeigen
    Hallo,

    hat jemand eine Lösung für das Problem mit dem auto_increment und InnoDB?

    Wenn ich einen Datensatz in einer Tabelle speichern will und dieser schief läuft oder ich diesen mit einem Rollback abbreche, erhöht sich dennoch der auto_increment-Wert des Primärschlüssels. Das kann doch nicht wahr sein!
    Warum ist das ein Problem? Die ID hat ja so oder so keine Bedeutung. Da könnte theoretisch auch irgendein Zufallswert stehen.

    Kommentar


    • #3
      Wenn du mit der ID weiter arbeitest um z.B. mehrere Tabellen zu verknüpfen, ist das schon ein Problem. Was denkst du wie schnell der AI-Wert in die Höhe schnellen kann. Es ist auf jeden Fall nicht zu ignorieren. Ich kann mich noch an vor 2 Jahren erinnern, das Szenario weiß ich leider nicht mehr, mir hat es alle Daten durcheinander gebracht.
      Zuletzt geändert von TriphunEM; 08.02.2012, 18:08.

      Kommentar


      • #4
        Wenn du davon ausgehst, dass die ID der nächsthöchste Wert ist, machst du sowieso was falsch. Den generierten Autoindex fragt man ab statt ihn zu erraten, dann kommen auch definitiv keine Daten durcheinander.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Zitat von TriphunEM Beitrag anzeigen
          Wenn du mit der ID weiter arbeitest um z.B. mehrere Tabellen zu verknüpfen, ist das schon ein Problem.
          Nein. Warum sollte das ein Problem sein?

          Zitat von TriphunEM Beitrag anzeigen
          Was denkst du wie schnell der AI-Wert in die Höhe schnellen kann. Es ist auf jeden Fall nicht zu ignorieren.
          Wieviele Milliarden Datensätze hast du vor zu speichern?

          Kommentar


          • #6
            Der Auto_Increment-Wert generiert Dir automatisch einen automatischen Schlüssel ... mehr nicht.

            Wie soll Deiner Meinung nach die Datenbank 2 parallele Transaktionen handeln, die beiden einen Auto_Increment anfordern, für die erste allerdings, nachdem die 2. Ihren Wert bekommen hat, ein Rollback durchgeführt wird?
            carpe noctem

            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

            Kommentar


            • #7
              Ja okay. Da hast du recht. Aber ich werd über kurz oder lang Millionen von Datensätzen anlegen, irgendwann ist auch ein LongInt erschöpft. Dann ist schluss. In InnoDB ein String als Primärschlüssel nehmen ist auch nicht das wahre, wie ich mich informiert habe.

              Kommentar


              • #8
                Ein Maximum von 18446744073709551615 reicht dir nicht?
                Wir werden alle sterben

                Kommentar


                • #9
                  MySQL :: MySQL 5.0 Reference Manual :: 10.1.1 Numeric Type Overview

                  Wenn dir 10^19 nicht ausreichen, hast du ein Speicherplatzproblem. Selbst wenn ein Datensatz nur 8 Byte groß wäre (so viel braucht man alleine für die bigint-Spalte), würdest du 134.217.728 Terabyte Speicherplatz benötigen, bevor du an das Limit von bigint anstößt. Sofern du nicht Google bist, gehe ich davon aus, dass du ohnehin nicht so viel zur Verfügung hast
                  Zuletzt geändert von AmicaNoctis; 13.02.2012, 08:44.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    Okay. Auch wieder wahr. Nur werden es ja nicht so viele Datensätze sein. Aber durch Rollbacks und parallelen Zugriffen schnellt der auto increment-Wert so schnell hoch, das ich da kein guten Bauchgefühl habe. Bei Test hab ich schon erlebt das der 10. Datensatz schon einen auto increment-Wert weit über 100 hatte, und da hab ich schon von schlimmeren werte gelesen!

                    Kommentar


                    • #11
                      Okay, dann teil den Wert durch 10 oder meinetwegen sogar durch 10.000. Bei letzterem sind es immer noch 13.400TB oder 1,8 Trillionen Datensätze. Die entscheidende Frage ist, ob du lang genug lebst, so viele Daten zu sammeln.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Zitat von TriphunEM Beitrag anzeigen
                        Okay. Auch wieder wahr. Nur werden es ja nicht so viele Datensätze sein. Aber durch Rollbacks und parallelen Zugriffen schnellt der auto increment-Wert so schnell hoch, das ich da kein guten Bauchgefühl habe. Bei Test hab ich schon erlebt das der 10. Datensatz schon einen auto increment-Wert weit über 100 hatte, und da hab ich schon von schlimmeren werte gelesen!
                        Hmmm....
                        Wenn du so viel, auf INSERT folgende Rollbacks, hast, dann scheint mir irgendwas am Konzept faul zu sein.

                        Sach doch mal, wie es zu so vielen kommt....
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Zitat von TriphunEM Beitrag anzeigen
                          Okay. Auch wieder wahr. Nur werden es ja nicht so viele Datensätze sein. Aber durch Rollbacks und parallelen Zugriffen schnellt der auto increment-Wert so schnell hoch, das ich da kein guten Bauchgefühl habe. Bei Test hab ich schon erlebt das der 10. Datensatz schon einen auto increment-Wert weit über 100 hatte, und da hab ich schon von schlimmeren werte gelesen!
                          Ich würde mich an das halten, was combie sagt, aber nur als Anmerkung nebenbei: Du kannst statt Integer-Werte auch UUIDs als Primärschlüssel verwenden.

                          Kommentar


                          • #14
                            Na okay. Ich werde es mal so versuchen.
                            Ich hab jetzt nochmal nach gedacht, was damals mein Problem war. Ich glaube es ist das Problem mit dem LAST_INSERT_ID, was fehlerhaft funktioniert.

                            Wenn ich Tabellen abhängig von einander beschreibe und will die letzte angelegte Id ermitteln, bekam ich oft die falsche Id und so ist alles durcheinander gekommen, was ja als Grund parallele Zugriffe haben könnte!

                            Kann es sein das LAST_INSERT_ID unabhängig von einer transaktion läuft?

                            Es geht um ein Statistik-Tool, was also bedeutet das pro Seitenaufruf einiges an Daten in den Tabellen gespeichert werden.

                            Und Rollbacks kommen nicht als so oft vor, aber parallele Zugriffe schon.

                            Kommentar


                            • #15
                              Zitat von TriphunEM Beitrag anzeigen
                              Na okay. Ich werde es mal so versuchen.
                              Ich hab jetzt nochmal nach gedacht, was damals mein Problem war. Ich glaube es ist das Problem mit dem LAST_INSERT_ID, was fehlerhaft funktioniert.

                              Wenn ich Tabellen abhängig von einander beschreibe und will die letzte angelegte Id ermitteln, bekam ich oft die falsche Id und so ist alles durcheinander gekommen, was ja als Grund parallele Zugriffe haben könnte!

                              Kann es sein das LAST_INSERT_ID unabhängig von einer transaktion läuft?

                              Es geht um ein Statistik-Tool, was also bedeutet das pro Seitenaufruf einiges an Daten in den Tabellen gespeichert werden.

                              Und Rollbacks kommen nicht als so oft vor, aber parallele Zugriffe schon.
                              Wenn du LAST_INSERT_ID() immer unmittelbar nach dem INSERT verwendest, sollte es keine Probleme geben. Aber warum rufst du selber LAST_INSERT_ID() auf? Überlass das doch der mysql-Extension von PHP.

                              Kommentar

                              Lädt...
                              X