MySQL AUTO_INCREMENT con ejemplos

โšก Resumen inteligente

MySQL AUTO_INCREMENT genera automรกticamente nรบmeros secuenciales para una columna numรฉrica cada vez que se inserta una fila. Este atributo elimina la necesidad de calcular identificadores รบnicos manualmente, lo que lo convierte en la forma estรกndar de completar una clave primaria.

  • ๐Ÿ”ข Comportamiento bรกsico: AUTO_INCREMENT emite el siguiente nรบmero en secuencia cada vez que se inserta una nueva fila, comenzando en 1 y pasoping por 1.
  • ๐Ÿ”‘ Funciรณn clave principal: Este atributo garantiza un identificador รบnico sin necesidad de una consulta de bรบsqueda, por lo que es la opciรณn estรกndar para una clave primaria sustituta.
  • ๐Ÿงฑ Requisitos de las columnas: La columna debe ser de tipo entero y debe estar indexada, lo cual ya cumple la declaraciรณn de CLAVE PRIMARIA.
  • โž• Insertar patrรณn: Omita la columna de identificador de la instrucciรณn INSERT y MySQL proporciona el valor y luego LAST_INSERT_ID() lo devuelve.
  • ๐ŸŽš๏ธ Valor inicial personalizado: CREATE TABLE o ALTER TABLE aceptan AUTO_INCREMENT = 10 para comenzar la secuencia en un nรบmero elegido.
  • ๐Ÿ•ณ๏ธ Prevea posibles lagunas: Las filas eliminadas y las transacciones revertidas consumen nรบmeros de forma permanente, por lo que la secuencia sigue siendo รบnica pero no contigua.

MySQL AUTOINCREMENTO

ยฟQuรฉ es el incremento automรกtico?

El incremento automรกtico es una funciรณn que opera con tipos de datos numรฉricos. Genera automรกticamente valores numรฉricos secuenciales cada vez que se inserta un registro en una tabla para un campo definido como incremento automรกtico.

Este atributo funciona con cualquier tipo de entero, desde TINYINT hasta BIGINT. La columna tambiรฉn debe estar indexada, lo cual ocurre automรกticamente al declararla como clave primaria.

ยฟCuรกndo se utiliza el incremento automรกtico?

En la lecciรณn sobre normalizaciรณn de base de datosAnalizamos cรณmo se pueden almacenar los datos con una redundancia mรญnima, almacenรกndolos en muchas tablas pequeรฑas, relacionadas entre sรญ mediante claves primarias y forรกneas.

MySQL AUTO_INCREMENT con ejemplos

Una clave primaria debe ser รบnica, ya que identifica de forma unรญvoca una fila en una base de datos. Pero, ยฟcรณmo podemos garantizar que la clave primaria sea siempre รบnica?

Una posible soluciรณn serรญa usar una fรณrmula para generar la clave primaria, que verifique la existencia de la clave en la tabla antes de agregar datos. Esto podrรญa funcionar, pero el mรฉtodo es complejo y no infalible. Dos sesiones que insertan datos simultรกneamente podrรญan leer el mismo valor mรกximo y generar un conflicto.

Para evitar tal complejidad y garantizar que la clave primaria sea siempre รบnica, podemos utilizar la MySQL Funciรณn de autoincremento para generar claves primarias. El autoincremento se utiliza con el tipo de dato INT. Este tipo de dato admite valores con y sin signo. Los datos sin signo solo pueden contener nรบmeros positivos. Como buena prรกctica, se recomienda definir la restricciรณn de "sin signo" en la clave primaria de autoincremento.

Sintaxis de incremento automรกtico

Una vez aclarado el razonamiento, observe el guion utilizado para crear la tabla de categorรญas de pelรญculas.

CREATE TABLE `categories` (
  `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `category_name` varchar(150) DEFAULT NULL,
  `remarks` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`category_id`)
);

Observe el โ€œAUTO_INCREMENTโ€ en el campo category_id. Esto hace que el ID de categorรญa se genere automรกticamente cada vez que se inserta una nueva fila en la tabla. No se proporciona al insertar datos en la tabla. MySQL lo genera.

Nota: La palabra clave UNSIGNED duplica el rango positivo de la columna y el ancho de visualizaciรณn que antes se escribรญa como int(11) estรก obsoleto. MySQL A partir del 8 de octubre de 2017. Simple int es la forma actual.

Por defecto, el valor inicial de AUTO_INCREMENT es 1, y se incrementarรก en 1 por cada nuevo registro.

Examinemos el contenido actual de la tabla de categorรญas.

SELECT * FROM `categories`;

Ejecutando el script anterior en MySQL Workbench contra myflixdb nos da los siguientes resultados.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL

Existen ocho filas, por lo que el siguiente ID generado deberรญa ser 9. Ahora insertemos una nueva categorรญa en la tabla de categorรญas, proporcionando solo el nombre.

INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');

Ejecutando el script anterior contra myflixdb en MySQL banco de trabajo nos da los siguientes resultados que se muestran a continuaciรณn.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL
9 Cartoons NULL

Tenga en cuenta que no proporcionamos el ID de la categorรญa. MySQL Se generรณ automรกticamente porque el ID de categorรญa estรก definido como autoincrementable.

Si desea obtener la รบltima identificaciรณn de inserciรณn generada por MySQL, puedes usar la funciรณn LAST_INSERT_ID para hacerlo. El script que se muestra a continuaciรณn obtiene la รบltima identificaciรณn que se generรณ.

SELECT LAST_INSERT_ID();

Al ejecutar el script anterior, se obtiene el รบltimo nรบmero de autoincremento generado por la consulta INSERT. Los resultados se muestran a continuaciรณn.

MySQL AUTOINCREMENTO

Tip: LAST_INSERT_ID() estรก limitado a tu propia conexiรณn, por lo que un valor generado por la inserciรณn de otro usuario nunca se te devolverรก por error.

Cรณmo establecer o restablecer el valor inicial de AUTO_INCREMENT.

La secuencia predeterminada comienza en 1, pero no siempre es lo que necesita un proyecto. Es posible que los nรบmeros de factura deban continuar desde un sistema heredado, y a menudo es necesario reiniciar una tabla de prueba. MySQL Esto expone el contador directamente, por lo que ambos casos se manejan con una sola clรกusula. Siga estos pasos para controlar el nรบmero inicial.

  1. Establezca el valor en el momento de la creaciรณn. Agregue la clรกusula AUTO_INCREMENT a la instrucciรณn CREATE TABLE. La primera fila insertada recibirรก ese nรบmero en lugar de 1.
  2. Modificar el valor de una tabla existente. Usar ALTERAR MESA con la misma clรกusula. MySQL Acepta el nuevo nรบmero solo si es mayor que el identificador mรกs grande almacenado actualmente.
  3. Restablece una tabla que hayas vaciado. La funciรณn TRUNCATE TABLE elimina todas las filas y restablece el contador a 1 en una sola operaciรณn, algo que la funciรณn DELETE por sรญ sola no hace.
  4. Confirma el cambio. Inserta una fila y lee el identificador con LAST_INSERT_ID() antes de confiar en la nueva secuencia.
-- Start a brand-new table at 1000
CREATE TABLE `invoices` (
  `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `amount` decimal(10,2),
  PRIMARY KEY (`invoice_id`)
) AUTO_INCREMENT = 1000;

-- Move the counter on an existing table
ALTER TABLE `categories` AUTO_INCREMENT = 100;

-- Empty the table and reset the counter to 1
TRUNCATE TABLE `categories`;

El tamaรฑo del paso tambiรฉn se puede modificar con la variable de sistema auto_increment_increment, pero se aplica a todo el servidor en lugar de a una sola tabla. Se utiliza principalmente en la replicaciรณn, donde dos servidores no deben generar el mismo identificador.

ยฟPor quรฉ aparecen huecos en una secuencia AUTO_INCREMENT?

Tarde o temprano, una tabla mostrarรก identificadores como 1, 2, 5, 6. No hay ningรบn problema. El contador estรก diseรฑado para garantizar la unicidad, no para garantizar una secuencia ininterrumpida de nรบmeros, y nunca emite el mismo valor dos veces.

Las lagunas aparecen por las siguientes razones.

  • Filas eliminadas: Cuando se elimina una fila de una tabla, su ID autoincrementado no se reutiliza. MySQL continรบa generando nuevos nรบmeros secuencialmente.
  • Transacciones revertidas: El nรบmero se reclama en el momento en que se ejecuta la inserciรณn. Si la transacciรณn se revierte, la fila desaparece, pero el nรบmero ya se ha utilizado.
  • Inserciones fallidas: Una instrucciรณn rechazada por una restricciรณn UNIQUE aรบn puede consumir un identificador antes de que falle.
  • Insertos a granel: InnoDB puede reservar un bloque de nรบmeros para una inserciรณn de varias filas y descartar los que no utiliza.

Intentar cerrar estas brechas es un error. Renumerar las filas rompe todas las claves forรกneas que las referencian, y el valor en sรญ no tiene relevancia para el negocio. Si un informe necesita una lista continua, genere el nรบmero de fila en la consulta en lugar de sobrescribir los datos almacenados.

Preguntas Frecuentes

No. MySQL permite exactamente una columna AUTO_INCREMENT por tabla, y esa columna debe estar indexada. Declararla como la clave principal Satisface el requisito del รญndice.

Las inserciones fallan con un error de clave duplicada, ya que el contador no puede avanzar mรกs allรก del mรกximo del tipo de datos. Un tipo de datos TINYINT sin signo se detiene en 255. Cambie la columna a un tipo de datos mรกs amplio, como BIGINT, antes de ese punto.

Si, de MySQL A partir de la versiรณn 8.0, InnoDB escribe el contador en el registro de transacciones, por lo que se restaura despuรฉs de un reinicio. Las versiones anteriores lo recalculaban y podรญan volver a emitir nรบmeros liberados por las eliminaciones.

En parte. Los asistentes de esquemas de IA dentro de herramientas como MySQL Banco de trabajo Sugiera un nรบmero entero sin signo lo suficientemente amplio para el volumen que describe. La estimaciรณn solo serรก tan precisa como la cifra de crecimiento que proporcione, asรญ que verifรญquela.

A menudo, sรญ. Los asistentes de consulta de IA seรฑalan transacciones revertidas y fallidas. INSERT declaraciones y filas eliminadas como causas habituales. Considere la explicaciรณn como un punto de partida y confรญrmela con los registros del servidor.

Resumir este post con: