sql >> Database teknologi >  >> Database Tools >> phpMyAdmin

Automatisk forøgelse af overspringsnumre?

Standard auto_increment-adfærden i MySQL 5.1 og senere vil "miste" auto-increment-værdier, hvis INSERT mislykkes. Det vil sige, den øges med 1 hver gang, men fortryder ikke en stigning, hvis INSERT fejler. Det er ualmindeligt at miste ~750 værdier, men ikke umuligt (jeg spurgte efter et websted, der springer 1500 over for hver INSERT, der lykkedes).

Du kan ændre innodb_autoinc_lock_mode=0 at bruge MySQL 5.0 adfærd og undgå at miste værdier i nogle tilfælde. Se http://dev.mysql. com/doc/refman/5.1/da/innodb-auto-increment-handling.html for flere detaljer.

En anden ting at kontrollere er værdien af ​​auto_increment_increment konfigurationsvariabel. Det er 1 som standard, men du har muligvis ændret dette. Igen, meget ualmindeligt at sætte det til noget højere end 1 eller 2, men muligt.

Jeg er enig med andre kommentatorer, autoinc-kolonner er beregnet til at være unikke, men ikke nødvendigvis fortløbende. Du skal nok ikke bekymre dig så meget om det, medmindre du fremmer autoinc-værdien så hurtigt, at du kan løbe uden for rækkevidden af ​​en INT (dette er sket for mig).

Hvordan fik du det præcist med at springe 1500 for evigt ind?

Årsagen til, at INSERT fejlede, var, at der var en anden kolonne med en UNIK begrænsning på den, og INSERT forsøgte at indsætte duplikerede værdier i den kolonne. Læs manualsiden, jeg linkede til for detaljer om, hvorfor dette er vigtigt.

Rettelsen var at lave en SELECT først for at kontrollere eksistensen af ​​værdien, før du forsøgte at INDSÆTTE den. Dette strider imod almindelig visdom, som er bare at prøve INSERT og håndtere enhver duplikatnøgleundtagelse. Men i dette tilfælde forårsagede bivirkningen af ​​den mislykkede INSERT, at en auto-inc-værdi gik tabt. Ved at lave en SELECT blev næsten alle sådanne undtagelser først fjernet.

Men du også skal håndtere en mulig undtagelse, selvom du VÆLGER først. Du har stadig en racetilstand.

Du har ret! innodb_autoinc_lock_mode=0 fungerede som en charme.

I dit tilfælde vil jeg gerne vide hvorfor så mange indsatser fejler. Jeg formoder, at du ligesom mange SQL-udviklere ikke tjekker for successtatus, efter du har lavet dine INSERTs i din AJAX-handler, så du ved aldrig, at så mange af dem fejler.

De fejler sandsynligvis stadig, du mister bare ikke auto-inc id'er som en bivirkning. Du bør virkelig diagnosticere, hvorfor så mange fejl opstår. Du kan enten generere ufuldstændige data eller køre mange flere transaktioner end nødvendigt.



  1. Hvordan kan jeg se fuld SQL-jobhistorik?

  2. Annuller en ordre manuelt

  3. Sådan nulstiller du automatisk stigningskolonne i en tabel i MySQL

  4. Er det muligt at rette en fremmednøgle i Yii uden at have sat den op i databasen?