sql >> Base de Datos >  >> Database Tools >> phpMyAdmin

¿Se saltan números de incremento automático?

El comportamiento predeterminado de auto_incremento en MySQL 5.1 y versiones posteriores "perderá" los valores de autoincremento si INSERT falla. Es decir, incrementa en 1 cada vez, pero no deshace un incremento si falla INSERT. Es poco común perder ~750 valores, pero no imposible (consulté un sitio que saltaba 1500 por cada INSERCIÓN que tuvo éxito).

Puede cambiar innodb_autoinc_lock_mode=0 para usar el comportamiento de MySQL 5.0 y evitar perder valores en algunos casos. Consulte http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html para más detalles.

Otra cosa a verificar es el valor de auto_increment_increment variable de configuración Es 1 por defecto, pero es posible que hayas cambiado esto. Nuevamente, es muy poco común establecerlo en algo más alto que 1 o 2, pero es posible.

Estoy de acuerdo con otros comentaristas, las columnas autoinc están destinadas a ser únicas, pero no necesariamente consecutivas. Probablemente no deberías preocuparte tanto por eso a menos que estés avanzando el valor de autoinc tan rápido que podrías quedarte fuera del rango de un INT (esto me ha pasado a mí).

¿Cómo lo arreglaste exactamente saltando 1500 para cada inserción?

La causa de la falla de INSERT fue que había otra columna con una restricción ÚNICA y INSERT estaba tratando de insertar valores duplicados en esa columna. Lea la página del manual a la que me vinculé para obtener detalles sobre por qué esto es importante.

La solución fue hacer SELECCIONAR primero para verificar la existencia del valor antes de intentar INSERTARLO. Esto va en contra de la sabiduría común, que es simplemente probar INSERTAR y manejar cualquier excepción de clave duplicada. Pero en este caso, el efecto secundario del INSERT fallido hizo que se perdiera un valor de incremento automático. Hacer una SELECCIÓN primero eliminó casi todas esas excepciones.

Pero tú también tiene que manejar una posible excepción, incluso si SELECCIONA primero. Todavía tienes una condición de carrera.

¡Tienes razón! innodb_autoinc_lock_mode=0 funcionó de maravilla.

En tu caso, me gustaría saber por qué tantas inserciones están fallando. Sospecho que, como muchos desarrolladores de SQL, no está comprobando el estado de éxito después de hacer sus INSERT en su controlador AJAX, por lo que nunca sabe que muchos de ellos están fallando.

Probablemente todavía estén fallando, simplemente no estás perdiendo las identificaciones de auto-inc como efecto secundario. Realmente deberías diagnosticar por qué ocurren tantas fallas. Podría estar generando datos incompletos o ejecutando muchas más transacciones de las necesarias.