El propósito de AUTO_INCREMENT
es generar identificadores únicos y sin sentido simples para sus filas. Tan pronto como tenga la intención de volver a utilizar esos ID, ya no son únicos (al menos no a tiempo), así que tengo la impresión de que no está utilizando la herramienta adecuada para el trabajo. Si decide deshacerse de AUTO_INCREMENT
, puede hacer todas sus inserciones con el mismo algoritmo.
Como sobre el código SQL, esta consulta coincidirá con filas existentes con las filas que tiene la siguiente ID:
SELECT a.foo_id, b.foo_id
FROM foo a
LEFT JOIN foo b ON a.foo_id=b.foo_id-1
Ej:
1 NULL
4 NULL
10 NULL
12 NULL
17 NULL
19 20
20 NULL
24 25
25 26
26 27
27 NULL
Así que es fácil de filtrar las filas y obtener la primera brecha:
SELECT MIN(a.foo_id)+1 AS next_id
FROM foo a
LEFT JOIN foo b ON a.foo_id=b.foo_id-1
WHERE b.foo_id IS NULL
tomar esto como un punto de partida, ya que todavía necesita algunos ajustes:
- Debe considerar el caso donde el número más bajo disponible es el más bajo posible.
- Debe bloquear la tabla para manejar inserciones concurrentes.
- En mi computadora es lento como el infierno con grandes mesas.
¿Por qué quieres hacer esto? Dichos "agujeros" son normales en el funcionamiento diario de la base de datos y no deberían ser una preocupación. Si esto se debe a una noción errónea de estética, resístala. – Oded
No deberías. Un auto_increment debería hacer su trabajo, y eso significa que se pueden hacer agujeros. Si empiezas a jugar con eso, irás a problemas más adelante. Solo déjalos estar. – Nanne
Sin mencionar que si se sigue haciendo referencia a una ID eliminada en algún lugar, es decir, a través de una tabla de enlace marcado/no actualizado, la adición de una nueva fila con esa ID producirá problemas involuntarios. Como dice Oded, Nanne, simplemente deja a la IA para hacer su trabajo. –