Incrément automatique ignorant les numéros?
Note: je suis nouveau sur des bases de données et PHP
J'ai un order
colonne est définie à auto increment
et unique
.
http://f.cl.ly/items/3u2D1l1j2l0j0A16450I/Image%202013-07-22%20at%207.00.15%20PM.png
Dans mon script PHP, j'utilise de l'AJAX pour obtenir de nouvelles données, mais le problème c'est que le order
saute les nombres et est nettement plus important, ce qui m'oblige à mettre à jour manuellement les numéros lorsque les données sont insérées. Dans ce cas, je finirais par changer de 782
à 38
.
http://f.cl.ly/items/0N2J1w1Y310E2H2o0m05/Image%202013-07-22%20at%206.49.20%20PM.png
$SQL = "INSERT IGNORE INTO `read`(`title`,`url`) VALUES\n ".implode( "\n,",array_reverse( $sql_values ) );
Comment puis-je obtenir pour incrémenter +1?
source d'informationauteur Chris Burton
Vous devez vous connecter pour publier un commentaire.
La valeur par défaut de type auto_increment comportement de MySQL 5.1 et plus tard se "perdre" de l'auto-incrémentation des valeurs si l'INSERTION échoue. C'est, il s'incrémente de 1 à chaque fois, mais ne pas annuler un incrément si l'INSERTION échoue. Il est rare de perdre ~750 valeurs, mais pas impossible (j'ai consulté pour un site qui sautait de 1500 pour chaque INSERTION, qui a réussi).
Vous pouvez modifier
innodb_autoinc_lock_mode=0
d'utiliser MySQL 5.0 comportement et d'éviter la perte des valeurs dans certains cas. Voir http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html pour plus de détails.Une autre chose à vérifier est la valeur de la
auto_increment_increment
variable de config. C'est 1 par défaut, mais vous pouvez avoir changé. Encore une fois, très rare de le mettre à quelque chose de plus grand que 1 ou 2, mais possible.Je suis d'accord avec les autres commentateurs, autoinc colonnes sont destinés à être unique, mais pas nécessairement consécutives. Vous ne devriez pas vous soucier tellement, sauf si vous êtes l'avancement de la autoinc valeur aussi rapidement que vous pouvez exécuter hors de la portée d'un INT (ce qui m'est arrivé).
La cause de l'INSÉRER à défaut était qu'il y avait une autre colonne avec une contrainte d'unicité, et de l'INSERTION a été d'essayer d'insérer des valeurs en double dans cette colonne. Lisez la page de manuel je lien pour plus de détails sur les raisons de cette matière.
La solution était de faire une sélection tout d'abord pour vérifier l'existence de la valeur avant de tenter de l'INSÉRER. Cela va à l'encontre de l'opinion commune, qui est juste essayer de l'INSÉRER et gérer n'importe quel double de la clé d'exception. Mais dans ce cas, les effets secondaires de l'échec de l'INSERTION provoqué une auto-inc valeur à être perdu. Faire un SÉLECTIONNEZ d'abord l'élimination de presque toutes ces exceptions.
Mais vous aussi avoir à gérer une exception possible, même si vous SÉLECTIONNEZ d'abord. Vous avez encore une condition de course.
Dans votre cas, je veux savoir pourquoi donc de nombreux inserts ne sont pas. Je soupçonne que, comme beaucoup de développeurs SQL, vous n'êtes pas à la vérification de l'état d'accomplissement après vous faites votre Insère dans votre AJAX gestionnaire, de sorte que vous ne savez jamais que beaucoup d'entre eux ne sont pas.
Ils sont probablement toujours pas, vous n'êtes tout simplement ne pas perdre de l'auto-inc id comme un effet secondaire. Vous devriez vraiment diagnostiquer pourquoi beaucoup ne parvient pas à se produire. Vous pourriez être de générer des données incomplètes, ou de l'exécution de beaucoup plus de transactions que nécessaire.
Après le changement de 782 38 vous pouvez réinitialiser l'auto-incrémentation avec
ALTER TABLE mytable AUTO_INCREMENT = 39
. De cette façon, vous continuez à 39.Cependant, vous devez vérifier pourquoi votre écart est si élevé, et de changer votre conception en conséquence. La modification de la autoincement ne devrait pas être "par défaut" de comportement.
Je sais que la question a déjà répondu.. Mais si vous avez supprimé des lignes dans la table avant, mysql va, rappelez-vous les utilisés ID/Numéro de parce que en général, votre Auto incrément est Unique.. donc ne va pas créer des doublons incréments.. indexer et de l'incrément de la courant max ID/integer, vous pourriez réaliser:
incrément automatique ne se soucie pas, si vous supprimer certaines lignes - chaque fois que vous insérez une ligne, la valeur est incrémentée.
Si vous voulez une numérotation sans lacunes, ne pas utiliser l'auto incrémentation et de faire par vous-même. Vous pouvez utiliser quelque chose comme cela pour arriver à cela pour l'insertion
et si vous supprimez une ligne, vous devez vous réarrangez la colonne ordre manuellement