¿Cambiar el número inicial de incremento automático?

264

En MySQL, tengo una tabla y quiero establecer el auto_incrementvalor en 5lugar de 1. ¿Es esto posible y qué declaración de consulta hace esto?

John Jones
fuente
no puedes CAMBIAR, solo aumenta
Vasilii Suricov
1
@VasiliiSuricov You can change this option with ALTER TABLE, but in that case the new value must be higher than the highest value which is present in the AUTO_INCREMENT column. source Si no hay un valor más alto que el que desea configurar su auto_incrementcolumna ed, también puede disminuir el valor. ( documentación de mysql )
seyfahni

Respuestas:

520

Puede usar ALTER TABLEpara cambiar el valor inicial de auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Consulte la referencia de MySQL para más detalles.

Daniel Vandersluis
fuente
66
Alguien sabe si es posible hacerlo SIN ALTER?
thesmart
3
Si es posible. Mira mi respuesta.
Cosimo
3
MySQL 5.6 tenía un error que no le permitía disminuir el AUTO_INCREMENTvalor, pero se ha corregido en 5.6.16 y 5.7.4, consulte bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis
3
¡Eche un vistazo a la advertencia de cosimo sobre la reconstrucción de la mesa si hace esto!
h00ligan
15
Para aclarar: Establecer el valor inicial en 5, significa que el próximo inserto será 5.
Steen Schütt
97

Sí, puedes usar la ALTER TABLE t AUTO_INCREMENT = 42declaración. Sin embargo, debe tener en cuenta que esto provocará la reconstrucción de toda su tabla, al menos con InnoDB y ciertas versiones de MySQL. Si tiene un conjunto de datos ya existente con millones de filas, podría llevar mucho tiempo completarlo .

En mi experiencia, es mejor hacer lo siguiente:

BEGIN WORK;
-- You may also need to add other mandatory columns and values
INSERT INTO t (id) VALUES (42);
ROLLBACK;

De esta forma, incluso si revierte la transacción, MySQL mantendrá el valor de incremento automático y el cambio se aplicará instantáneamente.

Puede verificar esto emitiendo una SHOW CREATE TABLE tdeclaración. Deberías ver:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...
Cosimo
fuente
55
¡GRACIAS! SET foreign_key_checks = 0;También es útil para esto.
dnozay
¡Brillante idea! Nitpick: en SHOW CREATE TABLE trealidad regresará 43, es decir, el siguiente valor después de la inserción 42.
petrkotek
2
@cosimo, espera, ¿no es esto indocumentado ? ¿El manual decía que debería funcionar de esa manera? Si no, puede romperse en una configuración mysql diferente (futura).
Pacerier
1
@Pacerier sí, tienes razón. Esto depende de la forma en que MySQL funciona actualmente. Puede que no funcione así en el futuro. Sin embargo, dado el historial de MySQL, supongo que continuará funcionando de esa manera durante mucho tiempo.
Cosimo
@cosimo, espero que lo documenten para que un código confiable realmente pueda usar este buen truco. A partir de ahora, el código que quiere ser confiable no puede usar esto.
Pacerier
13

Cómo incrementar automáticamente en uno, comenzando en 10 en MySQL:

create table foobar(
  id             INT PRIMARY KEY AUTO_INCREMENT,
  moobar         VARCHAR(500)
); 
ALTER TABLE foobar AUTO_INCREMENT=10;

INSERT INTO foobar(moobar) values ("abc");
INSERT INTO foobar(moobar) values ("def");
INSERT INTO foobar(moobar) values ("xyz");

select * from foobar;

'10', 'abc'
'11', 'def'
'12', 'xyz'

Este auto incrementa la columna de identificación en una a partir de 10.

Incremento automático en MySQL en 5, comenzando en 10:

drop table foobar
create table foobar(
  id             INT PRIMARY KEY AUTO_INCREMENT,
  moobar         VARCHAR(500)
); 
SET @@auto_increment_increment=5;
ALTER TABLE foobar AUTO_INCREMENT=10;

INSERT INTO foobar(moobar) values ("abc");
INSERT INTO foobar(moobar) values ("def");
INSERT INTO foobar(moobar) values ("xyz");

select * from foobar;
'11', 'abc'
'16', 'def'
'21', 'xyz'

Este auto incrementa la columna de identificación en 5 cada vez, comenzando en 10.

Eric Leschinski
fuente
5

Procedimiento para corregir automáticamente el valor AUTO_INCREMENT de la tabla

DROP PROCEDURE IF EXISTS update_auto_increment;
DELIMITER //
CREATE PROCEDURE update_auto_increment (_table VARCHAR(64))
BEGIN
    DECLARE _max_stmt VARCHAR(1024);
    DECLARE _stmt VARCHAR(1024);    
    SET @inc := 0;

    SET @MAX_SQL := CONCAT('SELECT IFNULL(MAX(`id`), 0) + 1 INTO @inc FROM ', _table);
    PREPARE _max_stmt FROM @MAX_SQL;
    EXECUTE _max_stmt;
    DEALLOCATE PREPARE _max_stmt;

    SET @SQL := CONCAT('ALTER TABLE ', _table, ' AUTO_INCREMENT =  ', @inc);
    PREPARE _stmt FROM @SQL;
    EXECUTE _stmt;
    DEALLOCATE PREPARE _stmt;
END//
DELIMITER ;

CALL update_auto_increment('your_table_name')
Zhitko Vladimir
fuente
3

Si necesita este procedimiento para nombres de campo variables en lugar de idesto, podría ser útil:

DROP PROCEDURE IF EXISTS update_auto_increment;
DELIMITER //
CREATE PROCEDURE update_auto_increment (_table VARCHAR(128), _fieldname VARCHAR(128))
BEGIN
    DECLARE _max_stmt VARCHAR(1024);
    DECLARE _stmt VARCHAR(1024);    
    SET @inc := 0;

    SET @MAX_SQL := CONCAT('SELECT IFNULL(MAX(',_fieldname,'), 0) + 1 INTO @inc FROM ', _table);
    PREPARE _max_stmt FROM @MAX_SQL;
    EXECUTE _max_stmt;
    DEALLOCATE PREPARE _max_stmt;

    SET @SQL := CONCAT('ALTER TABLE ', _table, ' AUTO_INCREMENT =  ', @inc);
    PREPARE _stmt FROM @SQL;
    EXECUTE _stmt;
    DEALLOCATE PREPARE _stmt;
END //
DELIMITER ;

CALL update_auto_increment('your_table_name', 'autoincrement_fieldname');
Thomas K.
fuente
2

También puedes hacerlo usando phpmyadmin. Simplemente seleccione la tabla que vaya a acciones. Y cambie el incremento automático debajo de las opciones de la tabla. No olvides hacer clic en Inicio Incremento automático en phpmyadmin

Viento del norte
fuente
-2

simplemente exporta la tabla con datos ... luego copia su sql like

CREATE TABLE IF NOT EXISTS `employees` (
  `emp_badgenumber` int(20) NOT NULL AUTO_INCREMENT,
  `emp_fullname` varchar(100) NOT NULL,
  `emp_father_name` varchar(30) NOT NULL,
  `emp_mobile` varchar(20) DEFAULT NULL,
  `emp_cnic` varchar(20) DEFAULT NULL,
  `emp_gender` varchar(10) NOT NULL,
  `emp_is_deleted` tinyint(4) DEFAULT '0',
  `emp_registration_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `emp_overtime_allowed` tinyint(4) DEFAULT '1',
  PRIMARY KEY (`emp_badgenumber`),
  UNIQUE KEY `bagdenumber` (`emp_badgenumber`),
  KEY `emp_badgenumber` (`emp_badgenumber`),
  KEY `emp_badgenumber_2` (`emp_badgenumber`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=111121326 ;

ahora cambie el valor de incremento automático y ejecute sql.

usuario1911721
fuente