Recientemente leí que debido a cómo InnoDB recalcula el valor de AUTO_INCREMENT cuando el servidor se reinicia, cualquier registro en el extremo superior de la lista de ID puede volver a usar sus ID.
Normalmente, esto no es un problema, porque cuando se elimina un usuario, todo lo relacionado con la ID también se elimina de otras tablas.
Pero dejo deliberadamente sus publicaciones en el foro huérfanas, etiquetadas como "Publicado por = Usuario # 123 =", para que se retengan las conversaciones pasadas. Claramente, si se reutiliza una identificación, esto será un problema.
Nunca he tenido este problema antes porque siempre había suficientes usuarios nuevos para que sea poco probable que una ID se reutilice de esta manera. Sin embargo, en mi nuevo proyecto, las inscripciones son raras y las eliminaciones de usuarios inactivas son frecuentes (especialmente dado que las cuentas "Open Alpha" solo duran tres días como una vista previa), y dicha reutilización de ID ha sucedido tres por tres ahora.
He "solucionado" el problema guardando el valor correcto para AUTO_INCREMENT en otro lugar y utilizándolo en lugar de confiar en el valor interno. ¿Hay alguna forma real de que InnoDB recuerde el último valor real?
Respuestas:
(evitando el problema al no eliminar nunca)
Como desea conservar la
"Posted by =User #123="
información después de eliminar al usuarioid=123
, también puede considerar usar 2 tablas para almacenar los datos de los usuarios. Uno paraActive
usuarios y uno para todos (incluidos los eliminados de los usuarios activos). Y nunca elimine esos identificadores de laAllUser
tabla:Por supuesto, esto complicará la operación de insertar un nuevo usuario. Cualquier usuario nuevo significará 2 inserciones, una en cada tabla. Sin embargo, la eliminación de un usuario se realizará
ActiveUser
solo en la tabla. Todos los FK se eliminarán en cascada, excepto las publicaciones del foro, que harán referencia a laAlluser
tabla (donde nunca se eliminará).fuente
No hay una forma natural de hacer esto, excepto usar information_schema.tables para registrar todas las columnas con la opción auto_increment.
Puede recopilar esas columnas de la siguiente manera:
Cree un script que restablecerá los valores de auto_increment
Entonces podría hacer una de dos cosas:
OPCIÓN # 1: Ejecutar script manualmente después del inicio
OPCIÓN # 2: haga que mysqld ejecute el script antes de permitir conexiones
Tendrías que agregar esta opción
De esa manera, cada vez que reinicie mysql, este script se ejecuta al principio. Tendrá que recordar regenerar /var/lib/mysql/ResetAutoInc.sql antes de hacer un reinicio planificado de mysql.
fuente
Los 5.5 documentos sugieren almacenar el valor de incremento automático en otro lugar como ya lo ha hecho.
Una solución alternativa sería emular una SECUENCIA para que no use el incremento automático en la tabla en sí. Esto ha sido discutido en SO antes y otra vez . El blog MySQL Performance lo menciona.
Sin embargo, otra información de MySQL atornilla que otros RDBMS no tienen ...
fuente
Simplemente no elimines al usuario. La integridad relacional es más importante. Si tiene que hacerlo por razones de privacidad o lo que sea, simplemente cambie el nombre de usuario a 'eliminado' y borre cualquier otro campo.
fuente
Esta es una vieja pregunta y sigue siendo relevante.
1) Este comportamiento se está reparando en Mysql 8.0.
2) Una solución es usar una fila ficticia para sus datos, para mantener el AUTO_INCREMENT por encima de un cierto valor. No es muy conveniente dependiendo de lo que esté almacenando, pero es una solución simple en algunos casos.
fuente
Necesitábamos una solución extrapolada para nuestro propio sistema basada en las instrucciones de esta publicación. Si esto puede ayudar a alguien a alcanzar su objetivo de una manera aún más fácil.
Nuestro sistema utiliza un patrón de tabla de lápidas para almacenar elementos eliminados porque hacemos una sincronización bidireccional en los sistemas desconectados, por lo que utilizamos este código para hacer coincidir las tablas de lápidas con sus tablas en vivo y extraer el mayor valor posible :)
fuente