Das war mal wieder grad mal wieder ein Fehler, wie er im Buche steht. Anwendung läuft seit Jahren astrein, aber auf einmal frisst die Tabelle keine neuen Einträge mehr. Als Entwickler sollte einem die Zahl 2147483647 ja bekannt vorkommen. Folgender Ablauf zum reproduzieren:
CREATE TABLE `produkt` ( `artikelnr` int(11) NOT NULL, `preis` float NOT NULL, PRIMARY KEY (`artikelnr`) );
Und der Inhalt:
INSERT INTO produkt (artikelnr, preis) VALUES (2147483647, 4.99); INSERT INTO produkt (artikelnr, preis) VALUES (2147483648, 6.95);
Das zweite insert-Statement liefert: #1062 – Duplicate entry ‚2147483647‘ for key ‚PRIMARY‘.
Simple Erklärung:
The number 2,147,483,647 is the maximum value for a 32-bit signed integer in computing.
Heißt: Beim Versuch, größere Zahlen zu inserten, setzt MySQL stellvertretend dafür die max-int-Zahl 2147483647 ein, was dann zu einem doppelten Primary Key führt. Abhilfe: Den Primary Key als unsigned kennzeichnen (max: 4294967295) oder einen BIGINT nehmen (max: 9223372036854775807). Wird der dann überschritten, geht der Insert übrigens nicht mehr „stillschweigend“ mit reduzierter Zahl durch sondern liefert eine Warning:
Warning: #1264 Out of range value for column 'artikelnr' at row 1
Ist mir auch schon passiert, seitdem markier ich immer alles als unsigned. Mir stellt sich jetzt nur die Frage, welcher Webshop > 2 Mrd. Artikel hat!?
Ich versuch in so Beispielen, immer möglichst viel unnötige Komplexität rauszunehmen. Eigentlich macht die Anwendung ganz was anderes ;)
Ich könnte vermuten (ich weiß es nicht), dass Amazon an so eine Menge herankommt :-)
Aber dieses Problem gibts ja nicht nur bei Shops, sondern auch überall, wo viele Einträge hinzugefügt werden.