FAQ |
Kalender |
![]() |
#11 | ||
|
|||
Nykomling
|
Hej Jesper!
Jag tycker din fråga verkar spännande och det kan finnas en potentiell bugg i någon version av Mysql som du har hittat. Jag kunde inte låta bli att prova med en egen tabell i en Mysql med InnoDB motor. Lade in några poster som hade en auto inkrementell räknare i sig. Därefter startade jag om tjänsten för att se om räknaren var nollställd. Det var den inte. Du skriver att din tabells data bara existerar några timmar eller kanske bara några dagar. Hur töms den? Men truncate nollställs såklart räknaren men inte med delete. Tycker problemet verkar konstigt snudd på barockt. Kan du om du orkar skriva ned de olika steg du gör för att "tappa" räknarens värde. Här är min tabell och de inställningar jag körde med (efter omstart av tjänst är värdet 5 inte 1). Hur ser din tabell ut? CREATE TABLE `slask` ( `counter` int(11) NOT NULL AUTO_INCREMENT, `someValue` char(50) COLLATE utf8_swedish_ci DEFAULT NULL, PRIMARY KEY (`counter`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci Serversetup Mysql 5.5.28 Ubuntu 12.04 Sen skulle du kunna göra så att du faktiskt sparar last_insert_id i en annan tabell som du sedan alltid hämtar ifrån och sedan ändrar din tabell med ALTER TABLE tbl AUTO_INCREMENT = Ditt värde; Men det låter som ett löjligt sätt att lösa ett okänt problem på. Det är nog bättre med en djupdykning och ta reda på orsaken. Vänligen Cornelii |
||
![]() |
![]() |
![]() |
#12 | ||
|
|||
Medlem
|
Tror inte det är en bugg, utan det är så det är tänkt att fungera, om jag inte är helt fel ute?. Alltså om du skapar upp några poster så att auto_increment ökar och sedan tar du bort dessa rader med delete så att tabellen töms (eller åtminstone så att de rader med högst id försvinner). När du sedan startar om servern och stoppar i nya rader så har auto_increment nollställts till den rad med högst id. Jag har inte själv testat detta men det är det som verkar vara "problemet"?
|
||
![]() |
![]() |
![]() |
#13 | ||
|
|||
Nykomling
|
Hej Lubic!
Gör följande. InnoDB 1. Ta bort en post från tabellen. Inkrementellt värde ser ut att vara samma som innan. Dvs om pekar var på position 5 så står det fortfarande 5. 2. service mysql restart (t.ex. omstart av databasen) 3. Inkrementellt värde har nu minskat till 4 MyIsam (ändra samma tabell till MyIsam) Samma procedur som ovan behåller räknarens inkrementella värde även efter omstart . Se länk. Citat:
|
||
![]() |
![]() |
![]() |
#14 | ||
|
|||
Medlem
|
Precis, då är det som jag har uppfattat det, och alltså inte en bugg som du misstänkte?
|
||
![]() |
![]() |
![]() |
#15 | ||
|
|||
Klarade millennium-buggen
|
Jag skulle säga att det är en bugg i kravspecifikationen, för autoincrement ska inte fungera som Max(PK) utan ska bevara sitt värde vid omstart.
|
||
![]() |
![]() |
![]() |
#16 | |||
|
||||
Klarade millennium-buggen
|
||||
![]() |
![]() |
![]() |
#17 | ||
|
|||
Nykomling
|
Mmm håller med Conny och Westman. En eye-opener efter 20 år i branschen, inte så vanligt numera.
Men okej nu känner vi till skillnaden och kanske kan InnoDBs sätt att ej behålla inkrementellt värde också användas av oss nu när vi har vetskapen om denna feature. Ha det gott nu i helgen! |
||
![]() |
![]() |
![]() |
#18 | ||
|
|||
Medlem
|
Lite blandade känslor att jag stötte på denna "buggen"/speccen, hade gärna varit lyckligt ovetande om detta beteendet, enda jag kommer på varför dom inte vill spara värdet annat än i ram är för att minska overheaden vid användandet av auto_increment, det skulle ju annars bli en extra skrivning till disk för varje increment värdeökning, men ja, jag hade gärna sett att man kunde välja beteendet åtminstonde så den faktiskt sparar värdet.
Jag har nu bytt så att min arkiverande tabell sköter auto_increment och så får min tillfälliga tabell styras av den, inga problem, kunde lika gärna varit så från början egentligen. Vill inte byta till MyISAM heller, rätt skönt att köra transaktioner i InnoDB. Iaf, kommer inte manuellt spara auto_increment värdet, nu vet jag ju om detta beteendet och det är sällan jag startar om mysql service eller servern, sällan den krashar också, så jag kan ju manuellt sätta auto_increment värdet om något av det inträffar. Men som sagt, jag hade hellre sett att det åtminstonde fanns ett val att spara auto_increment när man kör InnoDB, blev sjukt förvånad när jag vaknade en morgon och kollade loggarna och dom var sprängfyllda med: "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '402' for key 'PRIMARY'" Jag har alltid till 100% litat blint på att auto_increment skall garantera ett unikt värde, men i mitt scenario (om än går att undvika) så garanterades det inte Senast redigerad av JesperA den 2013-06-14 klockan 18:00 |
||
![]() |
![]() |
![]() |
#19 | ||
|
|||
Nykomling
|
Jesper: Lika förvånad jag. Har också blint trott på att värdena är unika och aldrig kan förekomma mer än en gång. Nu känns det lite som att varje gång vi vaknar på morgonen har vi fått ett nytt personnummer att lära oss.
|
||
![]() |
![]() |
![]() |
#20 | ||
|
|||
Medlem
|
hibernate tex, som mappar javaklasser till databas, använder en separat tabell för "sequence" , asså ett nästa värde... det har nog sina anledningar.
|
||
![]() |
![]() |
Svara |
|
|