sql >> Databasteknik >  >> Database Tools >> phpMyAdmin

Öka överhoppningsnummer automatiskt?

Standardbeteendet för auto_increment i MySQL 5.1 och senare kommer att "tappa" auto-increment-värden om INSERT misslyckas. Det vill säga, den ökar med 1 varje gång, men ångrar inte en ökning om INSERT misslyckas. Det är ovanligt att förlora ~750 värden men inte omöjligt (jag sökte efter en webbplats som hoppade över 1500 för varje INSERT som lyckades).

Du kan ändra innodb_autoinc_lock_mode=0 att använda MySQL 5.0 beteende och undvika att förlora värden i vissa fall. Se http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html för mer information.

En annan sak att kontrollera är värdet på auto_increment_increment konfigurationsvariabel. Det är 1 som standard, men du kan ha ändrat detta. Återigen, mycket ovanligt att ställa in det till något högre än 1 eller 2, men möjligt.

Jag håller med andra kommentatorer, autoinc-kolumner är avsedda att vara unika, men inte nödvändigtvis i följd. Du borde antagligen inte oroa dig så mycket om du inte flyttar fram autoinc-värdet så snabbt att du kan köra utanför intervallet för en INT (detta har hänt mig).

Hur fixade du att det hoppade över 1500 för alltid?

Orsaken till att INSERT misslyckades var att det fanns en annan kolumn med en UNIK begränsning på den, och INSERT försökte infoga dubbletter av värden i den kolumnen. Läs manualsidan jag länkade till för detaljer om varför detta är viktigt.

Korrigeringen var att göra en SELECT först för att kontrollera existensen av värdet innan du försökte INFOGA det. Detta går emot allmän visdom, som är att bara prova INSERT och hantera alla dubbletter av nyckelundantag. Men i det här fallet orsakade bieffekten av den misslyckade INSERT att ett auto-inc-värde gick förlorat. Att göra en SELECT först eliminerade nästan alla sådana undantag.

Men du också måste hantera ett eventuellt undantag, även om du SELECT först. Du har fortfarande ett tävlingstillstånd.

Du har rätt! innodb_autoinc_lock_mode=0 fungerade som en charm.

I ditt fall skulle jag vilja veta varför så många insatser misslyckas. Jag misstänker att du, precis som många SQL-utvecklare, inte kontrollerar framgångsstatus efter att du har gjort dina INSERTs i din AJAX-hanterare, så du vet aldrig att så många av dem misslyckas.

De misslyckas förmodligen fortfarande, du förlorar bara inte auto-inc-id:n som en bieffekt. Du bör verkligen diagnostisera varför så många misslyckanden inträffar. Du kan antingen generera ofullständig data eller köra många fler transaktioner än nödvändigt.



  1. Wordpress-mall:Objektet hittades inte

  2. MySQL-fråga för att få modala medelvärden för en kolumn?

  3. MySQL Multiple Database Setup

  4. Hur man uppdaterar en kolumn i mySQL-databas med Excel