En primer lugar, ¿qué ventaja está tratando de obtener mediante la reutilización de los valores omitidos? Un ordinario INT UNSIGNED
le permitirá contar hasta 4.294.967.295. Con "millones de registros", su base de datos tendría que crecer miles de veces antes de quedarse sin identificaciones válidas. (Y a continuación, utilizando un BIGINT UNSIGNED
topará que hasta 18,446,744,073,709,551,615 valores.)
Tratando de reciclar los valores de MySQL ha saltado es probable que utilizar una gran cantidad de su tiempo tratando de compensar algo que realmente no molesta en el MySQL primer lugar.
Dicho esto, se pueden encontrar los ID de falta con algo como:
SELECT id + 1
FROM the_table
WHERE NOT EXISTS (SELECT 1 FROM the_table t2 WHERE t2.id = the_table.id + 1);
Esto encontrará sólo el primera número que falta en cada secuencia (por ejemplo, si usted tiene {1, 2, 3, 8, 10}
encontrará {4,9}
), pero es probable que sea eficiente y, por supuesto, una vez que haya ingresado una identificación, siempre podrá ejecutarla nuevamente.
relacionados: http://stackoverflow.com/questions/3718229/stop-mysql-reusing-auto-increment-ids –
Si está utilizando un INT para su clave primaria, que puede tener como 2 mil millones + registros. ¿Por qué molestarse en tratar de llenar los vacíos? ¿Te estás quedando sin números? Encuentro que hay una ventaja al saber que los números corresponden al orden en que se agregaron los registros. – minboost
Tal vez se encontrará con menos problemas de rendimiento al cambiar el tipo de clave principal para BIGINT (si es 4 mil millones de valores proporcionados por int es demasiado corta) de tratar de volver a utilizar los identificadores en un muy gran mesa. –