Tema SQL
LAST_INSERT_ID() (MySQL / MariaDB)
Devuelve el primer valor AUTO_INCREMENT generado en la sesión para la tabla afectada por el INSERT más reciente. Esencial para APIs que insertan y necesitan la clave en la misma conexión.
Descripción
LAST_INSERT_ID([expr]) sin argumento devuelve el autoincrement de la última inserción bien formada en esa conexión; con expresión numérica fija el contador interno de sesión (uso avanzado, poco habitual). No es seguro en entornos con pool si la conexión se reutiliza sin garantizar la secuencia insert→lectura en la misma sesión. En tablas con múltiples AUTO_INCREMENT no aplica igual: solo el primero. En replicación, el valor refleja lo generado en el primario según el flujo de binlog. En PostgreSQL se usa RETURNING id; en SQL Server OUTPUT inserted.id o SCOPE_IDENTITY().
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
LAST_INSERT_ID()
LAST_INSERT_ID(expresión)
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Sesión
- El valor es por conexión, no global al servidor.
- INSERT múltiple
- Tras INSERT … VALUES (…), (…), el ID devuelto suele ser el del primer registro generado.
- Alternativas
- UUID generado en aplicación o secuencias según diseño.
Ejemplos
Ejemplo 1
INSERT INTO pedidos (cliente_id, total) VALUES (42, 99.90);
SELECT LAST_INSERT_ID() AS nuevo_pedido_id;
INSERT INTO lineas (pedido_id, sku, cantidad)
VALUES (LAST_INSERT_ID(), 'SKU1', 2);
Ejemplo 2
INSERT INTO bitacora (tabla, pk) VALUES ('pedidos', LAST_INSERT_ID());
SELECT LAST_INSERT_ID() + 0 AS id_forzado;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.