Alterar o número inicial do incremento automático?

264

No MySQL, eu tenho uma tabela e quero definir o auto_incrementvalor para em 5vez de 1. Isso é possível e qual instrução de consulta faz isso?

John Jones
fonte
Você não pode mudar, só aumentam
Vasilii Suricov
1
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. Fonte @VasiliiSuricov Se não houver um valor maior do que o que você deseja definir na auto_incrementcoluna ed, você também poderá diminuir o valor. ( mysql documentation )
seyfahni

Respostas:

520

Você pode usar ALTER TABLEpara alterar o valor inicial de incremento automático:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Veja a referência do MySQL para mais detalhes.

Daniel Vandersluis
fonte
6
Alguém sabe se é possível fazer SEM ALTER?
theSmart
3
Sim é possivel. Veja minha resposta.
Cosimo
3
O MySQL 5.6 tinha um bug que não permitia diminuir o AUTO_INCREMENTvalor, mas foi corrigido nas versões 5.6.16 e 5.7.4, veja bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis
3
Dê uma olhada no aviso da cosimo sobre a reconstrução da mesa se você fizer isso!
precisa saber é o seguinte
15
Para esclarecer: Definir o valor inicial para 5, significa que a próxima inserção será 5.
Steen Schütt
97

Sim, você pode usar a ALTER TABLE t AUTO_INCREMENT = 42declaração No entanto, você precisa estar ciente de que isso causará a reconstrução de toda a sua tabela, pelo menos com o InnoDB e algumas versões do MySQL. Se você já possui um conjunto de dados com milhões de linhas, pode levar muito tempo para concluir .

Na minha experiência, é melhor fazer o seguinte:

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

Dessa forma, mesmo se você estiver revertendo a transação, o MySQL manterá o valor de incremento automático e a alteração será aplicada instantaneamente.

Você pode verificar isso emitindo uma SHOW CREATE TABLE tdeclaração. Você deveria ver:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...
Cosimo
fonte
5
OBRIGADO! SET foreign_key_checks = 0;também é útil para isso.
dnozay
Ideia brilhante! Nitpick: SHOW CREATE TABLE trealmente retornará 43, ou seja, o próximo valor após a inserção 42.
Petrkotek 27/05
2
@cosimo, espera, isso não é documentado ? O manual dizia que deveria funcionar dessa maneira? Caso contrário, pode ocorrer uma instalação mysql diferente (futura).
Pacerier
1
@ Pacerier sim, você está correto. Isso depende da maneira como o MySQL funciona atualmente. Pode não funcionar assim no futuro. Dado o histórico do MySQL, eu diria que continuará a funcionar dessa maneira por um longo tempo.
Cosimo
@cosimo, Espero que eles o documentem para que um código confiável possa realmente usar esse bom hack. A partir de agora, o código que deseja ser confiável não pode usar isso.
Pacerier
13

Como incrementar automaticamente um a partir de 10 no 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'

Isso incrementa automaticamente a coluna de identificação em uma começando em 10.

Incremento automático no MySQL em 5, começando em 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'

Isso incrementa automaticamente a coluna de identificação em 5 a cada vez, começando em 10.

Eric Leschinski
fonte
5

Procedimento para corrigir automaticamente o valor AUTO_INCREMENT da tabela

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
fonte
3

Se você precisar deste procedimento para nomes de campos variáveis ​​em vez iddisso, pode 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.
fonte
2

Você também pode fazer isso usando phpmyadmin. Basta selecionar a tabela e ir para ações. E altere as opções da tabela Incremento automático abaixo. Não se esqueça de clicar em Iniciar Incremento automático no phpmyadmin

Vento Norte
fonte
-2

apenas exporte a tabela com dados .. copie seu sql como

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 ;

agora altere o valor do incremento automático e execute o sql.

user1911721
fonte