¿Cómo restablecer AUTO_INCREMENT en MySQL?


1246

¿Cómo puedo restablecer el AUTO_INCREMENTde un campo?
Quiero que comience a contar de 1nuevo.


99
Puede obtener una mejor respuesta en el sitio para DBA en dba.stackexchange.com
Rowland Shaw

80
Probablemente también quieras vaciar la mesa:TRUNCATE TABLE yourTableName;
Konerak


3
Sí, truncar tabla es mejor en este caso. también restablece el inicio del incremento automático a 1.
raidsan

2
A veces no tienes permiso para TRUNCAR ya que eso requiere permisos DROP.
Luke Cousins ​​el

Respuestas:


2025

Puede restablecer el contador con:

ALTER TABLE tablename AUTO_INCREMENT = 1

Para InnoDB no puede establecer el auto_incrementvalor más bajo o igual al índice actual más alto. (cita de ViralPatel ):

Tenga en cuenta que no puede restablecer el contador a un valor menor o igual a cualquiera que ya se haya utilizado. Para MyISAM, si el valor es menor o igual que el valor máximo actualmente en la columna AUTO_INCREMENT, el valor se restablece al máximo actual más uno. Para InnoDB, si el valor es menor que el valor máximo actual en la columna, no se produce ningún error y el valor de secuencia actual no cambia.

¿ Vea cómo restablecer un AutoIncrement de MySQL usando un valor MAX de otra tabla? sobre cómo obtener dinámicamente un valor aceptable.


8
Esto puede llevar una eternidad para una mesa llena. Tenga cuidado con esto: stackoverflow.com/questions/2681869/…
BT

52
esto es uncircular reference
Besnik

55
¿Qué quieres decir con curcular reference?
Niels

73
Tenga en cuenta que MySql creará una nueva tabla, con la misma estructura y el nuevo valor de auto_increment y copiará todos los registros de la tabla original, soltará el original y cambiará el nombre de la nueva. Esto podría tener un impacto considerable en el rendimiento (y espacio en disco) en los entornos de producción si la tabla es grande.
Rostol

66
¿Esta respuesta altamente votada realmente funciona si ya tiene una columna AUTOINCREMENT? De acuerdo con los documentos de MySQL 5.1: "No puede restablecer el contador a un valor menor o igual a cualquiera que ya se haya utilizado. Para MyISAM, si el valor es menor o igual al valor máximo actualmente en la columna AUTO_INCREMENT, el el valor se restablece al máximo actual más uno. Para InnoDB, si el valor es menor que el valor máximo actual en la columna, no se produce ningún error y el valor de secuencia actual no cambia ". Parece que no pasará nada aquí si el autoincremento es mayor que 1.
lreeder

160
ALTER TABLE tablename AUTO_INCREMENT = 1

77
¿Puedo saber cuál es la diferencia entre su respuesta y la respuesta anterior
Praveen Srinivasan

30
@PraveenSrinivasan no hay diferencia, los agregamos al mismo tiempo
boobiq

79
Personalmente, creo que es hermoso que estas dos respuestas para una pregunta AUTO_INCREMENT hayan tenido una colisión de concurrencia :-)
Mark Goldfain

@ MarkGoldfain sí lo es!
ncomputers

la concurrencia causará la condición de la carrera mysql ...
Syamsoul Azrien

81
SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

Creo que esto lo hará


2
Esta pregunta ya tiene una respuesta adecuada. Además, UPDATEactualizará todos los valores en la idcolumna.
Kermit

2
El OP no indica que están reordenando las filas existentes.
Kermit

Respuesta completa y perfecta. Pero tengo una duda de que cuando insertemos un nuevo valor, cuál será el PK de ese valor. Si es 1 o la próxima PK?
Prifulnath

Si esta es la mejor solución, pero es posible que quieran tablas de bloqueo si hay datos que están siendo Escrito por ejemplo, tablas de producción
wavvves

muy útil, tuve el mismo requisito donde tuve que restablecer el incremento automático para comenzar con 1, solo ayudaron los dos primeros comandos.
LOKENDRA


40

ingrese la descripción de la imagen aquíHay una manera muy fácil con phpmyadmin en la pestaña "operaciones", puede establecer, en las opciones de la tabla, aumento automático al número que desee.


Debe reiniciar el servicio / servidor mysql justo después de eso.
Cyber

1
No creo que necesite reiniciar su servidor después de eso. PhpAdmin simplemente ejecutará el comando para cambiar el punto de inicio del incremento.
Kareem

No necesita reiniciar, surte efecto desde la siguiente inserción.
IlludiumPu36

36

La mejor solución que funcionó para mí:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;

¡Es rápido, funciona con innoDB, y no necesito saber el valor máximo actual! De esta manera, el contador de incremento automático se reiniciará y se iniciará automáticamente a partir del valor máximo existente.


1
establecerá el valor NULL auto-inc en information_schema; checkSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
Probé en la versión 5.6.xy funcionó perfectamente, y la consulta de Kerem Güneş devolvió el valor máximo más uno, NO nulo como se indicó. (tal vez se establece en nulo después de la primera consulta, pero no después de la segunda consulta) Creo que esta es la mejor solución para InnoDB.
Frank Forte

Igual que el valor explícito establecido: "cree una nueva tabla, con la misma estructura y el nuevo valor de aumento automático y copie todos los registros de la tabla original, suelte el original y cambie el nombre de la nueva. Esto podría tener un impacto considerable en el rendimiento (y espacio en disco) en entornos de producción si la tabla es grande ". pero mucho peor porque necesita copiar la tabla completa dos veces.
Enyby

Verifico que esto funciona para la versión 5.6.15, mientras ALTER TABLE tablename AUTO_INCREMENT = 1que no .
Nae

24

Las respuestas mejor calificadas a esta pregunta recomiendan "ALTERAR yourtable AUTO_INCREMENT = value". Sin embargo, esto solo funciona cuando valuela alteración es mayor que el valor máximo actual de la columna de autoincremento. De acuerdo con la documentación de MySQL 8 :

No puede restablecer el contador a un valor menor o igual al valor que está actualmente en uso. Tanto para InnoDB como para MyISAM, si el valor es menor o igual al valor máximo actualmente en la columna AUTO_INCREMENT, el valor se restablece al valor máximo actual de la columna AUTO_INCREMENT más uno.

En esencia, solo puede alterar AUTO_INCREMENT para aumentar el valor de la columna de autoincremento, no restablecerlo a 1, como el OP pregunta en la segunda parte de la pregunta. Para ver las opciones que realmente le permiten establecer el AUTO_INCREMENT hacia abajo desde su máximo actual, eche un vistazo a Reordenar / restablecer la clave primaria de incremento automático .


20

Agregar una actualización porque la funcionalidad cambió en MySQL 5.6. A partir de MySQL 5.6, PUEDES usar la ALTER TABLE simple con InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Los documentos se actualizan para reflejar esto:

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

Mi prueba también muestra que la tabla NO se copia, simplemente se cambia el valor.


19

Hay buenas opciones en Cómo restablecer la columna de aumento automático de MySQL

Tenga en cuenta que ALTER TABLE tablename AUTO_INCREMENT = value;no no funciona para InnoDB


8
¿Cómo hacer esto con InnoDB?
EmptyArsenal

44
Funciona bien para mí usando MySQL v 5.6.2
Eddie B

Tuve un problema similar en el que un campo de aumento automático no se restablecía después de eliminar registros de una tabla. TRUNCATE parece haber funcionado. Creo que las soluciones a continuación para eliminar el autoincremento y luego volver a aplicar pueden ayudar a aliviar esto.
Craig Maloney

@CraigMaloney: DELETE(o ROLLBACK) no recuperará los identificadores. Una excepción: después de un reinicio (o bloqueo), se calcula que la siguiente identificación es MAX(id)+1, recuperando así los identificadores eliminados al final . Excepción a la excepción: MySQL 8.0 deja esos identificadores sin usar.
Rick James

12
ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)

Utilicé esto en algunos de mis scripts, el campo de identificación se descarta y luego se agrega nuevamente con la configuración anterior, todos los campos existentes dentro de la tabla de la base de datos se completan con nuevos valores de incremento automático, esto también debería funcionar con InnoDB.

Tenga en cuenta que todos los campos dentro de la tabla serán contados y tendrán otros identificadores.


3
¡Me gustaría tener algo como esto! Pero como una advertencia extra; esto obviamente rompería completamente sus claves foráneas.
NoobishPro

12

También puede usar la TRUNCATEtabla de sintaxis como esta: TRUNCATE TABLE table_name

¡¡TENER CUIDADO!! TRUNCATE TABLE your_tablese elimine todo en tu your_table!!


14
Nuevos programadores , tenga en cuenta que TRUNCATEtambién eliminará TODAS sus filas en la tabla especificada.
Zanshin13

1
El comentario anterior debe insertarse en la respuesta, o al menos una explicación sobre el uso real de truncar.
Lucas Kauz

TRUNCATErestablecerá los auto_incrementcampos también? Mi caso de uso es borrar los datos antiguos en la tabla e iniciar las ID desde 1 nuevamente para obtener datos nuevos (imagínese, borrando la tabla para un uso adecuado después de completar la prueba). Pensé que tendría DROPtoda la mesa y CREATEotra vez.
ADTC

Sí, TRUNCATE funciona como un reinicio en la tabla. Eso no es del todo cierto si una tabla ha sido ALTERADA desde su creación, entonces esos cambios no se restablecerán. Supongo que está más cerca de exportar la estructura de la tabla y usar la exportación para crear una nueva tabla que un reinicio real.
Chris

Sí @ADTC. Si desea mantener el auto_incrementvalor actual , use en DELETE FROMlugar de TRUNCATE.
TRiG

8

es para mesa vacía:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

si tiene datos pero desea ordenarlos, le recomiendo usar esto:

ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD  `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);

fácil de usar
Abdul Aziz Al Basyir

Esto funcionó para nosotros con datos. Restablece la fila al siguiente índice. ¡Gracias!
Deslumbra el

urwell @Dazzle!
Abdul Aziz Al Basyir

5

Aquí está mi solución, pero no aconsejaré hacerlo si su columna tiene restricciones o está conectada como clave externa a otras tablas, ya que tendría efectos negativos o incluso no funcionaría.

> Primero: suelte la columna

ALTER TABLE tbl_name DROP COLUMN column_id

> Segundo: recrea la columna y configúrala como PRIMERO si la quieres como la primera columna, supongo.

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

Esto funciona bien!


3

A partir de MySQL 5.6, el siguiente enfoque funciona más rápido debido a DDL en línea (nota algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;


2

Simplemente puede truncar la tabla para restablecer la secuencia

TRUNCATE TABLE TABLE_NAME

1

Intenté alterar la tabla y establecer auto_increment en 1 pero no funcionó. Decidí eliminar el nombre de la columna que estaba incrementando, luego creé una nueva columna con su nombre preferido y configuré esa nueva columna para que se incremente desde el inicio.


¿Podría explicar cómo hizo que eso sucediera?
MZaragoza

@MZaragoza Simplemente suelte la columna anterior que no tiene IA y luego cree una nueva que tenga AI habilitada.
andromeda

¿Puedes actualizar tu respuesta para mostrar esto? Realmente lo agradecería
MZaragoza

1

El contador de incremento automático para una tabla se puede (re) configurar de dos maneras:

  1. Al ejecutar una consulta, como otros ya explicaron:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Usando Workbench u otra herramienta de diseño de base de datos visual. Voy a mostrar en Workbench cómo se hace, pero no debería ser muy diferente en otras herramientas también. Al hacer clic derecho sobre la tabla deseada y elegir Alter tabledesde el menú contextual. En la parte inferior, puede ver todas las opciones disponibles para modificar una tabla. Elija Optionsy obtendrá este formulario: ingrese la descripción de la imagen aquí

    Luego, simplemente configure el valor deseado en el campo Auto incrementcomo se muestra en la imagen. Básicamente, esto ejecutará la consulta que se muestra en la primera opción.


0

Para actualizar la última más una identificación

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);


0

Busqué en Google y encontré esta pregunta, pero la respuesta que realmente estoy buscando cumple dos criterios:

  1. utilizando consultas puramente MySQL
  2. restablecer un incremento automático de tabla existente a max (id) + 1

Como no pude encontrar exactamente lo que quiero aquí, he improvisado la respuesta de varias respuestas y la he compartido aquí.

Pocas cosas a tener en cuenta:

  1. la tabla en cuestión es InnoDB
  2. la tabla usa el campo idcon tipo como intclave principal
  3. la única forma de hacer esto puramente en MySQL es usar un procedimiento almacenado
  4. mis imágenes a continuación están usando SequelPro como GUI. Debería poder adaptarlo en función de su editor MySQL preferido
  5. He probado esto en MySQL Ver 14.14 Distrib 5.5.61, para debian-linux-gnu

Paso 1: Crear procedimiento almacenado

crear un procedimiento almacenado como este:

DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN

      SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
      PREPARE stmt FROM @get_next_inc; 
      EXECUTE stmt; 
      SELECT @next_inc AS result;
      DEALLOCATE PREPARE stmt; 

      set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

Entonces ejecútalo.

Antes de la ejecución, se ve así cuando mira en Procedimientos almacenados en su base de datos.

ingrese la descripción de la imagen aquí

Cuando ejecuto, simplemente selecciono el procedimiento almacenado y presiono Ejecutar selección

ingrese la descripción de la imagen aquí

Nota: la parte delimitadores es crucial. Por lo tanto, si copia y pega de las respuestas seleccionadas en esta pregunta, tienden a no funcionar por este motivo.

Después de correr, debería ver el procedimiento almacenado

ingrese la descripción de la imagen aquí

Si necesita cambiar el procedimiento almacenado, debe eliminar el procedimiento almacenado, luego seleccione ejecutar nuevamente.

Paso 2: llame al procedimiento almacenado

Esta vez simplemente puede usar consultas normales de MySQL.

call reset_autoincrement('products');

Originalmente de mis propias notas de consultas SQL en https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc y adaptado para StackOverflow


0
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;

-1

Intenta ejecutar esta consulta

 ALTER TABLE tablename AUTO_INCREMENT = value;

O pruebe esta consulta para restablecer el incremento automático

 ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;

Y establecer el incremento automático y luego ejecutar esta consulta

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

-2

Le sugiero que vaya al navegador de consultas y haga lo siguiente:

  1. Vaya a esquemas y busque la tabla que desea modificar.
  2. Haga clic derecho y seleccione copiar crear declaración.
  3. Abra una pestaña de resultados y pegue la declaración create.
  4. Vaya a la última línea de la instrucción create y busque Auto_Increment = N, (donde N es un número actual para el campo auto_increment).
  5. Reemplace N con 1.
  6. Presione ctrl+enter .

Auto_increment debería restablecerse a uno una vez que ingrese una nueva fila en la tabla.

No sé qué sucederá si intentas agregar una fila donde ya existe un valor de campo auto_increment.

¡Espero que esto ayude!


-2

La mejor manera es eliminar el campo con AI y agregarlo nuevamente con AI, funciona para todas las tablas


1
no es la mejor manera en absoluto, soltar una columna perderá los datos de la columna
Disha Goyal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.