Phil: MySQL zählt nicht mehr hoch

Hi!
Ich habe seit kurzem ein Problem mit meiner MySQL-Datenbank: ich habe ein Feld (id, tinyint(4), primary key, auto_increment), das bei jedem neuen Datensatz automatisch hochzählt. Dazu lasse ich dann das entsprechende Feld frei, MySQL fügt dann ja die nöchstgrößere Zahl ein.

Nun funktioniert das hier nicht mehr:
Der Wert bleibt bei 127 hängen. Die Zeile mit der ID 127 wird irgendwie nach einigen Minuten gelöscht und so ist die ID 127 wieder frei. Füge ich, solange diese Zeile noch da ist, noch einen Datensatz ein, so kommt "Duplicate key 127", obwohl das feld auf auto_increment steht...

Was habe ich falsch gemacht oder was ist hier los?
Kennt ihr das? Und wenn ja, wie kann man das beheben?

CU
Phil
http://www.yubb.de

  1. Halihallo Phil

    Ich habe seit kurzem ein Problem mit meiner MySQL-Datenbank: ich habe ein Feld (id, tinyint(4), primary key, auto_increment), das bei jedem neuen Datensatz automatisch hochzählt. Dazu lasse ich dann das entsprechende Feld frei, MySQL fügt dann ja die nöchstgrößere Zahl ein.

    Nun funktioniert das hier nicht mehr:
    Der Wert bleibt bei 127 hängen. Die Zeile mit der ID 127 wird irgendwie nach einigen Minuten gelöscht und so ist die ID 127 wieder frei. Füge ich, solange diese Zeile noch da ist, noch einen Datensatz ein, so kommt "Duplicate key 127", obwohl das feld auf auto_increment steht...

    Nun, es scheint, als ob mysql nicht über 127 zählen kann. Hast du einen vorzeichenbehafteten INT(1) als Primary genommen?
    Duplicate key 127 ist ganz normal, da ein Primary zwingend Unique also eindeutig sein muss.
    Versuch mal die Feldgrösse des PrimaryKeys zu erhöhen, z. B. INT(2), UNSIGNED (bei auto_inc immer UNSIGNED!).

    Viele Grüsse

    Philipp

    1. Hi!
      Hm, habe nu von tinyint(4) auf int(11) geändert und das unsigned an gemacht.
      Und es scheint zu funzen... Aber was ist dieses unsigned?!
      CU
      http://www.yubb.de

      1. Halihallo Phil

        Hm, habe nu von tinyint(4) auf int(11) geändert und das unsigned an gemacht.
        Und es scheint zu funzen... Aber was ist dieses unsigned?!

        Falsch. Es funktioniert jetzt bis 255, siehe:

        http://www.mysql.com/doc/en/Column_types.html

        <paste>
        TINYINT[(M)] [UNSIGNED] [ZEROFILL]
        A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.
        </paste>

        Unsignet bedeutet "Vorzeichenlos". Eine vorzeichenbehaftete Zahl verwendet ein Bit, um + oder - zu "speichern". "Fällt" bei einer unsignet-number dieses Bit "weg", kann es zur Speicherung des Wertes verwendet werden => mit unsigned Zahlen kannst du doppelt soviele Werte (im positiven Bereich, der negative Fällt dadurch eben weg) darstellen.
        Da auto_inc immer bei 1 anfängt und es niemals zu negativen Werten kommt, macht unsigned natürlich wesentlich mehr Sinn.

        Viele Grüsse

        Philipp

        1. Falsch. Es funktioniert jetzt bis 255, siehe:
          <paste>
          TINYINT[(M)] [UNSIGNED] [ZEROFILL]
          A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.
          </paste>

          Ich nutz doch nun int(11) ;)
          Wie weit geht es denn da? Ich mein, nicht dass der mir bei sagen wir 1024 wieder wechkillt, KÄME ich da mal hin...

          1. Halihallo Phil

            Falsch. Es funktioniert jetzt bis 255, siehe:
            <paste>
            TINYINT[(M)] [UNSIGNED] [ZEROFILL]
            A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.
            </paste>

            Ich nutz doch nun int(11) ;)

            Upsa, sorry ;)

            Wie weit geht es denn da? Ich mein, nicht dass der mir bei sagen wir 1024 wieder wechkillt, KÄME ich da mal hin...

            Ne, ne. 2^(11*8) gibt etwas mehr als 1024 ;-)
            Aus Erfahrung (und einigen mathematischen Kenntnissen) kann ich dich beruhigen: So schnell kommst du nicht dahin ;-)

            Viele Grüsse

            Philipp

            1. Hallo,

              Ne, ne. 2^(11*8) gibt etwas mehr als 1024 ;-)

              INT ist und bleibt ein 32-Bit-Datentyp fuer ganze Zahlen. INT(11) bedeutet die max. Anzeige von 11 Stellen, (10 Stellen + ggf. negatives Vorzeichen).

              MfG, Thomas

  2. Versuch mal das feld als int(10) zu definieren. könnte dein problem lösen...

    1. Halihallo alex

      Versuch mal das feld als int(10) zu definieren. könnte dein problem lösen...

      Stimmt. Wobei INT(10) schon fast etwas zu übertrieben ist (für die meisten Anwendungen). Aber tinyint (255 mögliche Zustände) für id zu nehmen ist wohl etwas arg untertrieben. Das macht nur in spezialfällen Sinn (wenn man davon ausgehen kann, dass _nie_ mehr als 255 Records angelegt werden müssen, meinetwegen Länder, davon gibt's glaub ich nur 192 oder so und so schnell wird sich das nicht ändern [vorher kriegt man Probleme mit der Timestamp]).

      btw. Timestamp: Dort ist doch bei 2030 rum auch Ende-Feuer, oder? - Das Y2k-Problem für die Timestamp.

      Viele Grüsse

      Philipp