devian: Duplicate entry '4294967295' for key 'PRIMARY' / Selbstverschuld

Hallo liebe Foren Gemeinschaft,
ich habe ein kleines und doch irgendwie großes Problem.
Ich habe eine MYSQL-Tabelle mit dem Feld ID. Das Feld ist auf auto_increment gesetzt und ist zugleich im Indizes das PRIMARY feld (sagt man das so?!). Er ist also der Primärschlüßel.

Alles lief bis ich testweiße eine ID in der Tabelle bearbeitet habe. Ich habe einfach den Wert ,,222222222222222222'' eingegeben. Darauf wurde in der DB dann ,,4294967295". Jedes mal wenn ich nun einen Eintrag hinzufügen will kommt jedes Mal der Fehler ,,Duplicate entry '4294967295' for key 'PRIMARY'''.

Wie kann ich das nun wieder rückgängig machen? Ich habe die ID schon wieder geändert. Aber der Fehler kommt trotzdem.

Vielen Dank für eure Hilfe!

  1. Suche in der Suchmaschine deines geringsten Misstrauens nach
    autoincrement zurücksetzen

    1. Suche in der Suchmaschine deines geringsten Misstrauens nach
      autoincrement zurücksetzen

      Ich habe ein wenig gesucht und folgenden code gefunden:
      ALTER TABLE tabelle_blah_blah AUTO_INCREMENT = 1;
      Damit soll mal den auto_increment wert wieder auf 1 setzten können. Mein Vorteil ist, dass ich weiß ab wo er weiter zählen soll.Kann ich dann nicht einfach sagen
      ALTER TABLE tabelle_blah_blah AUTO_INCREMENT = 79727;
      Sodass er den nächsten Wert die ID 79728 gibt?

      Mfg devian

      1. Mein Vorteil ist, dass ich weiß ab wo er weiter zählen soll.Kann ich dann nicht einfach sagen
        ALTER TABLE tabelle_blah_blah AUTO_INCREMENT = 79727;
        Sodass er den nächsten Wert die ID 79728 gibt?

        Ja, aber vorher alle größeren Ids löschen (dürfte eh nur eine sein).

      2. Hello,

        Ich habe ein wenig gesucht und folgenden code gefunden:
        ALTER TABLE tabelle_blah_blah AUTO_INCREMENT = 1;
        Damit soll mal den auto_increment wert wieder auf 1 setzten können. Mein Vorteil ist, dass ich weiß ab wo er weiter zählen soll.Kann ich dann nicht einfach sagen
        ALTER TABLE tabelle_blah_blah AUTO_INCREMENT = 79727;
        Sodass er den nächsten Wert die ID 79728 gibt?

        Das ist aber falsch.
        Du willst doch deine IDs nicht kaputtspielen, oder?
        Es soll doch nur die verspielte ID entfernt werden?

        Die übrigen wollen wir doch tunlichst erhalten, wenn sie denn mit Sinn angelegt worden sind. Es könnten schließlich Rlationen darüber aufgebaut sein?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hello,

          Ich habe ein wenig gesucht und folgenden code gefunden:
          ALTER TABLE tabelle_blah_blah AUTO_INCREMENT = 1;
          Damit soll mal den auto_increment wert wieder auf 1 setzten können. Mein Vorteil ist, dass ich weiß ab wo er weiter zählen soll.Kann ich dann nicht einfach sagen
          ALTER TABLE tabelle_blah_blah AUTO_INCREMENT = 79727;
          Sodass er den nächsten Wert die ID 79728 gibt?

          Das ist aber falsch.
          Du willst doch deine IDs nicht kaputtspielen, oder?
          Es soll doch nur die verspielte ID entfernt werden?

          Die übrigen wollen wir doch tunlichst erhalten, wenn sie denn mit Sinn angelegt worden sind. Es könnten schließlich Rlationen darüber aufgebaut sein?

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          Eigentlich ist ja nur eine ID zu groß. Ich habe es eben mal ausprobiert auf der lokalen version meiner website. Dort ging es ohne probleme. Zu große ID entfernt. In MYSQL die IDs nach aufsteigender reihnfolge sortiert, die größte ausgewählt und mit dem von mir genannten code den auto_increment wert auf die letzte id gesetzt. Die Einträge die danach kammen erhielten immer +1 auf die letzte id.

          Oder übersehe ich jetzt irgendwelche Risiken? Wie meinst Du das mit kaputtspielen?

          1. Hello,

            Eigentlich ist ja nur eine ID zu groß. Ich habe es eben mal ausprobiert auf der lokalen version meiner website. Dort ging es ohne probleme. Zu große ID entfernt. In MYSQL die IDs nach aufsteigender reihnfolge sortiert, die größte ausgewählt und mit dem von mir genannten code den auto_increment wert auf die letzte id gesetzt. Die Einträge die danach kammen erhielten immer +1 auf die letzte id.

            Du hast. So geht das.
            http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

            Wenn es keine ID gibt, die größer als der eingetellte Wert ist, sollte das klappen.
            Voraussetzung ist allerdings, dass es noch keine Relationen gibt zu den von Dir beseitigten IDs. Sonst ist Deine DB jetzt nicht mehr integer.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
  2. Hello,

    ich habe ein kleines und doch irgendwie großes Problem.
    Ich habe eine MYSQL-Tabelle mit dem Feld ID. Das Feld ist auf auto_increment gesetzt und ist zugleich im Indizes das PRIMARY feld (sagt man das so?!). Er ist also der Primärschlüßel.

    Alles lief bis ich testweiße eine ID in der Tabelle bearbeitet habe. Ich habe einfach den Wert ,,222222222222222222'' eingegeben. Darauf wurde in der DB dann ,,4294967295". Jedes mal wenn ich nun einen Eintrag hinzufügen will kommt jedes Mal der Fehler ,,Duplicate entry '4294967295' for key 'PRIMARY'''.

    Wie kann ich das nun wieder rückgängig machen? Ich habe die ID schon wieder geändert. Aber der Fehler kommt trotzdem.

    Es gibt eine "Mastertabelle", in der der nächste zu benutzende Primary Key steht.
    Da Du durch das unkoordinierte (oder bewusst forschende *g*) Eintragen eines Wertes außerhalb des erlaubten Wertebereiches die obere Grenze erreicht hast, kann nun der Autoincrement nicht weiter hochgezählt werden.

    Ist übrigens mal ein sehr interessanter Versuch zu Grenzwerten, denn IT ist ja hauptsächlich an den jeweiligen Grenzen spannend :-))

    Du müsstest alle wertigen Datensätze in eine Temporärtabelle übertragen, danach die betroffene Tabelle zurücksetzen[1] und dann die Werte aus der Temporärtabelle wieder einfügen.

    Das sollte der offizielle Weg sein, das Problem zu lösen.

    [1] Es ist ein Unterschied, wie Du das delete-Statement benutzt oder ob Du gleich Truncate benutzt
    http://dev.mysql.com/doc/refman/5.1/en/delete.html
    http://dev.mysql.com/doc/refman/5.1/en/truncate-table.html

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. Moin!

    Ja, und nimm für Spalten mit Autoincrement im Zweifelsfall den Datentyp "bigint". Der reicht mit Vorzeichen bis 9223372036854775807, ohne dieses bis 18446744073709551615. Ansonsten kannst Du nicht mal jedem Erdenbewohner seine eigene ID geben.

    Was mich noch wundert: Der Primary Key wird (ohne, dass es technisch notwendig ist) aus Gründen der Übersicht an die erste Stelle (auf die erste Spalte) gesetzt, welche regelmäßig auch eine durch Autoinkrement erzeugte, eineindeutige Datensatz-Id enthält. Warum brichst Du mit dieser Regel? Das schafft doch nur eine Fehlerquelle.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix