AUTO_INCREMENT
AUTO_INCREMENT genera automáticamente un valor numérico único y secuencial para una columna. Es la forma estándar de crear identificadores de fila en MySQL: cada vez que insertas una fila sin especificar el valor de la columna, MySQL asigna el siguiente número de la secuencia. Todas las tablas de nuestra base de datos tienda_mysql usan AUTO_INCREMENT para su columna id.
Sintaxis
CREATE TABLE nombre_tabla (
id INT AUTO_INCREMENT PRIMARY KEY,
...
);AUTO_INCREMENT solo puede aplicarse a columnas enteras (TINYINT, SMALLINT, INT, BIGINT) y la columna debe tener un índice (normalmente PRIMARY KEY o UNIQUE).
Comportamiento básico
CREATE TABLE tareas (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(200) NOT NULL
);
INSERT INTO tareas (titulo) VALUES ('Primera tarea');
INSERT INTO tareas (titulo) VALUES ('Segunda tarea');
INSERT INTO tareas (titulo) VALUES ('Tercera tarea');
SELECT * FROM tareas;| id | titulo |
|---|---|
| 1 | Primera tarea |
| 2 | Segunda tarea |
| 3 | Tercera tarea |
MySQL asigna 1, 2, 3 automáticamente. No necesitas conocer el último valor ni preocuparte por duplicados.
Insertar con valor explícito
Puedes especificar un valor para la columna AUTO_INCREMENT:
INSERT INTO tareas (id, titulo) VALUES (10, 'Tarea diez');
INSERT INTO tareas (titulo) VALUES ('Siguiente tarea');
SELECT * FROM tareas;| id | titulo |
|---|---|
| 1 | Primera tarea |
| 2 | Segunda tarea |
| 3 | Tercera tarea |
| 10 | Tarea diez |
| 11 | Siguiente tarea |
Después de insertar manualmente el valor 10, el siguiente valor automático es 11 (el máximo actual + 1). MySQL siempre genera valores mayores que el máximo existente.
LAST_INSERT_ID()
Para obtener el último valor AUTO_INCREMENT generado en tu sesión:
INSERT INTO tareas (titulo) VALUES ('Tarea nueva');
SELECT LAST_INSERT_ID();| LAST_INSERT_ID() |
|---|
| 12 |
LAST_INSERT_ID() es específico de tu sesión. Si otro usuario inserta una fila al mismo tiempo, tu LAST_INSERT_ID() no se ve afectado. Es la forma segura de obtener el ID en entornos concurrentes.
Con múltiples filas, devuelve el ID de la primera fila insertada:
INSERT INTO tareas (titulo) VALUES ('Tarea A'), ('Tarea B'), ('Tarea C');
SELECT LAST_INSERT_ID();| LAST_INSERT_ID() |
|---|
| 13 |
Las tres filas obtuvieron IDs 13, 14 y 15, pero LAST_INSERT_ID() devuelve 13 (el primero).
Valor inicial
Por defecto, la secuencia empieza en 1. Puedes cambiar el valor inicial:
CREATE TABLE facturas (
numero INT AUTO_INCREMENT PRIMARY KEY,
cliente VARCHAR(100),
total DECIMAL(10, 2)
) AUTO_INCREMENT = 1000;
INSERT INTO facturas (cliente, total) VALUES ('Ana', 150.00);
INSERT INTO facturas (cliente, total) VALUES ('Luis', 275.00);
SELECT * FROM facturas;| numero | cliente | total |
|---|---|---|
| 1000 | Ana | 150.00 |
| 1001 | Luis | 275.00 |
Las facturas empiezan en 1000, lo que es útil para dar la apariencia de un negocio establecido o para separar rangos de IDs entre sistemas.
Reiniciar la secuencia
Para cambiar el próximo valor AUTO_INCREMENT:
ALTER TABLE tareas AUTO_INCREMENT = 100;
INSERT INTO tareas (titulo) VALUES ('Tarea desde 100');
SELECT * FROM tareas ORDER BY id DESC LIMIT 1;| id | titulo |
|---|---|
| 100 | Tarea desde 100 |
Solo puedes establecer un valor mayor que el máximo actual. Si intentas un valor menor, MySQL lo ignora silenciosamente.
Los IDs no se reutilizan
Cuando eliminas una fila, su ID no se reasigna:
DELETE FROM tareas WHERE id = 2;
INSERT INTO tareas (titulo) VALUES ('Tarea nueva tras borrado');
SELECT id, titulo FROM tareas ORDER BY id;| id | titulo |
|---|---|
| 1 | Primera tarea |
| 3 | Tercera tarea |
| 10 | Tarea diez |
| 11 | Siguiente tarea |
| 12 | Tarea nueva |
| 13 | Tarea A |
| 14 | Tarea B |
| 15 | Tarea C |
| 100 | Tarea desde 100 |
| 101 | Tarea nueva tras borrado |
El ID 2 desapareció y no se reutiliza. La nueva fila obtuvo el ID 101. Esta es una característica, no un error: los IDs son identificadores permanentes, no posiciones.
Huecos en la secuencia
Los huecos (gaps) en la secuencia son normales y pueden ocurrir por varias razones: filas eliminadas, transacciones que hacen rollback, INSERT IGNORE que falla por duplicado, o reinicios del servidor.
En InnoDB, si insertas una fila dentro de una transacción y después haces ROLLBACK, el ID se consume pero no se reutiliza:
START TRANSACTION;
INSERT INTO tareas (titulo) VALUES ('Tarea temporal');
-- Supongamos que obtiene id = 102
ROLLBACK;
INSERT INTO tareas (titulo) VALUES ('Tarea después del rollback');
-- Obtiene id = 103, no 102No intentes eliminar los huecos. Los IDs son identificadores, no contadores. Las aplicaciones no deberían depender de que los IDs sean consecutivos.
AUTO_INCREMENT con BIGINT
Para tablas con un volumen potencialmente enorme de datos, usa BIGINT:
CREATE TABLE eventos (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tipo VARCHAR(50),
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);INT soporta hasta 2,147,483,647 valores (4 mil millones con UNSIGNED). BIGINT soporta hasta 9,223,372,036,854,775,807. Para la mayoría de aplicaciones, INT es más que suficiente.
Ver el valor actual
Para ver el próximo valor AUTO_INCREMENT de una tabla:
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'tareas';O con SHOW CREATE TABLE:
SHOW CREATE TABLE tareas\GLa última línea muestra AUTO_INCREMENT=XXX.
AUTO_INCREMENT en tienda_mysql
Todas nuestras tablas usan AUTO_INCREMENT. Veamos los valores actuales:
SELECT TABLE_NAME, AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'tienda_mysql'
AND AUTO_INCREMENT IS NOT NULL
ORDER BY TABLE_NAME;| TABLE_NAME | AUTO_INCREMENT |
|---|---|
| categorias | 17 |
| clientes | 21 |
| detalle_pedidos | 42 |
| empleados | 11 |
| etiquetas_producto | 30 |
| pedidos | 26 |
| productos | 31 |
| resenas | 21 |
Cada tabla tiene el próximo valor disponible. categorias tiene 16 filas, así que el próximo ID sería 17. productos tiene 30, así que el próximo sería 31.
Comportamiento tras reiniciar MySQL
En MySQL 8.0 con InnoDB, el valor AUTO_INCREMENT se persiste en disco. Esto significa que después de reiniciar el servidor, el valor se mantiene correctamente.
En versiones anteriores (MySQL 5.7 y anteriores), el valor AUTO_INCREMENT de InnoDB se calculaba al iniciar como MAX(id) + 1. Si habías eliminado las últimas filas, los IDs se reutilizaban tras un reinicio. MySQL 8.0 corrigió este comportamiento.
Variables de configuración
MySQL tiene una variable de sesión para cambiar el incremento:
SET @@auto_increment_increment = 2;
SET @@auto_increment_offset = 1;Con esta configuración, los IDs generados serían 1, 3, 5, 7... Esto es útil en configuraciones de replicación maestro-maestro, donde cada servidor genera IDs impares o pares para evitar colisiones.
Limpieza
DROP TABLE IF EXISTS tareas;
DROP TABLE IF EXISTS facturas;
DROP TABLE IF EXISTS eventos;Con esto completamos la sección de restricciones. Hemos cubierto todas las restricciones fundamentales de MySQL: NOT NULL para datos obligatorios, PRIMARY KEY para identificación única, FOREIGN KEY para relaciones entre tablas, ON DELETE CASCADE para eliminaciones en cascada, UNIQUE para valores no duplicados, DEFAULT para valores automáticos, CHECK para validaciones personalizadas, y AUTO_INCREMENT para IDs secuenciales. En la siguiente sección exploraremos los tipos de datos de MySQL en detalle.
Escrito por Eduardo Lázaro
