Ir al contenido principal

Web Hosting y WordPress Hosting — Por qué los ID de una tabla no empiezan en 1 ni son consecutivos (AUTO_INCREMENT)

Escrito por Daiana Benitez

Aplica a: Web Hosting y WordPress Hosting · Interfaz: phpMyAdmin o cliente SQL · Nivel: avanzado · Tiempo estimado: 10 min


¿Qué vas a lograr?

Entender por qué los campos AUTO_INCREMENT de tus tablas MySQL no empiezan en 1 ni son consecutivos en el entorno de bases de datos de Web Hosting y WordPress Hosting, y adaptar tu aplicación para que no dependa de IDs específicos.


Por qué ocurre

El entorno de bases de datos de Donweb es clusterizado: trabajan varios nodos a la vez, cada uno con distintos valores iniciales e incrementos de autoincremento. Esto evita que se generen identificadores duplicados, mantiene la consistencia de la información y brinda alta disponibilidad.

Por ejemplo, los IDs pueden distribuirse así:

  • Un nodo genera: 1, 4, 7, 10…

  • Otro nodo genera: 2, 5, 8, 11…

  • Otro nodo genera: 3, 6, 9, 12…

Por eso, aunque vacíes una tabla con TRUNCATE, no se garantiza que el siguiente registro tenga el ID 1. No es un error: es parte del funcionamiento del entorno.


Alternativa 1 — Consultar el primer registro sin depender del ID 1

Si tu proceso vacía una tabla, la vuelve a cargar y luego consulta el primer registro con algo como:

sql

SELECT * FROM tabla_temporal WHERE id = 1;

Reemplazalo por:

sql

SELECT * FROM tabla_temporal ORDER BY id ASC LIMIT 1;

Por ejemplo, si después de vaciar y volver a cargar la tabla los registros tienen los IDs 2, 5 y 8, esta consulta devuelve el de ID 2, que es el menor disponible.

Si necesitás el primer registro según otro criterio (una fecha, por ejemplo), usá ese campo en el ORDER BY.


Alternativa 2 — Usar una numeración propia, independiente del ID

Si necesitás que un proceso tenga números 1, 2, 3…, usá un campo separado del autoincremento y una tabla que controle esa numeración.

Paso 1 — Crear las tablas (se hace una sola vez)

sql

CREATE TABLE ejemplo_secuencias (     nombre VARCHAR(50) PRIMARY KEY,     valor BIGINT UNSIGNED NOT NULL ) ENGINE=InnoDB;  CREATE TABLE ejemplo_registros (     id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,     numero BIGINT UNSIGNED NOT NULL UNIQUE,     descripcion VARCHAR(100) ) ENGINE=InnoDB;  INSERT INTO ejemplo_secuencias (nombre, valor) VALUES ('registro', 0);

Paso 2 — Generar el número y guardar el registro

Ejecutá este bloque completo, en la misma conexión, cada vez que necesites insertar un registro:

sql

START TRANSACTION;  UPDATE ejemplo_secuencias SET valor = LAST_INSERT_ID(valor + 1) WHERE nombre = 'registro';  SET @numero = LAST_INSERT_ID();  INSERT INTO ejemplo_registros (numero, descripcion) VALUES (@numero, 'Registro de prueba');  COMMIT;

Al repetir el bloque, el resultado podría ser:

id (interno)

numero

descripcion

2

1

Registro de prueba

5

2

Registro de prueba

8

3

Registro de prueba

El id interno sigue el autoincremento del servidor, y el campo numero usa la secuencia que administra tu aplicación. Esta secuencia se mantiene continua entre ejecuciones y no se reinicia al vaciar otra tabla.


Verificá que funcionó

  • Alternativa 1: la consulta devuelve el registro de menor ID, sin importar cuál sea ese número

  • Alternativa 2: el campo numero va de 1 en 1, aunque el id interno tenga saltos


Errores frecuentes

“Vacié la tabla con TRUNCATE y el primer registro no tiene ID 1”

→ Es el comportamiento esperado en el entorno clusterizado. Adaptá tu consulta con la Alternativa 1 para no depender de un ID fijo.

“Mis IDs tienen saltos (2, 5, 8…)”

→ Es normal: cada nodo genera IDs con su propio inicio e incremento. Si necesitás una numeración continua, usá la Alternativa 2 en un campo aparte.

“Necesito que un número empiece en 1 y sea consecutivo”

→ No uses el campo AUTO_INCREMENT para eso. Usá una numeración propia como en la Alternativa 2.


¿Ha quedado contestada tu pregunta?