Como redefinir AUTO_INCREMENT no MySQL?


1246

Como posso redefinir o AUTO_INCREMENTcampo?
Quero que comece a contar 1novamente.


9
Você pode obter uma melhor resposta no site para DBAs em dba.stackexchange.com
Rowland Shaw

80
Você provavelmente também desejará esvaziar a mesa:TRUNCATE TABLE yourTableName;
Konerak


3
Sim, a tabela truncada é melhor neste caso. ele também reset automático incremento começar a 1.
raidsan

2
Às vezes, você não tem permissão para TRUNCATE, pois isso requer permissões DROP.
Luke Cousins

Respostas:


2024

Você pode redefinir o contador com:

ALTER TABLE tablename AUTO_INCREMENT = 1

Para o InnoDB, você não pode definir o auto_incrementvalor menor ou igual ao índice atual mais alto. (citação da ViralPatel ):

Observe que você não pode redefinir o contador para um valor menor ou igual a qualquer um que já tenha sido usado. Para MyISAM, se o valor for menor ou igual ao valor máximo atualmente na coluna AUTO_INCREMENT, o valor será redefinido para o máximo atual mais um. Para o InnoDB, se o valor for menor que o valor máximo atual na coluna, nenhum erro ocorrerá e o valor atual da sequência não será alterado.

Veja Como redefinir um incremento automático do MySQL usando um valor MAX de outra tabela? sobre como obter dinamicamente um valor aceitável.


8
Isso pode levar uma eternidade para uma mesa cheia. Tenha cuidado com isso: stackoverflow.com/questions/2681869/…
BT

52
este é umcircular reference
Besnik

5
Como assim curcular reference?
Niels

73
Lembre-se de que o MySql criará uma nova tabela, com a mesma estrutura e o novo valor de auto_increment, além de copiar todos os registros da tabela original, largar o original e renomear o novo. Isso pode ter um impacto considerável no desempenho (e espaço em disco) nos ambientes de produção, se a tabela for grande.
Rostol 9/09/13

6
Essa resposta altamente votada realmente funciona se você já possui uma coluna AUTOINCREMENT? De acordo com os documentos do MySQL 5.1: "Você não pode redefinir o contador para um valor menor ou igual a qualquer um que já tenha sido usado. No MyISAM, se o valor for menor ou igual ao valor máximo atualmente na coluna AUTO_INCREMENT, o o valor é redefinido para o máximo atual mais um. No InnoDB, se o valor for menor que o valor máximo atual na coluna, nenhum erro ocorrerá e o valor atual da sequência não será alterado. " Parece que nada vai acontecer aqui se o autoincrement é maior que 1.
lreeder

160
ALTER TABLE tablename AUTO_INCREMENT = 1

7
Posso saber qual é a diferença entre a sua resposta ea resposta anterior
Praveen Srinivasan

30
@PraveenSrinivasan nenhuma diferença, nós adicionamos-los ao mesmo tempo
boobiq

79
Pessoalmente, eu acho que é uma bela coisa que estas duas respostas para uma pergunta AUTO_INCREMENT teve uma colisão concorrência :-)
Mark Goldfain

@MarkGoldfain yes it is!
Ncomputers

simultaneidade causará condição de corrida mysql ...
Syamsoul Azrien

81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Eu acho que isso fará isso


2
Esta pergunta já tem uma resposta apropriada. Além disso, você UPDATEatualizará todos os valores na idcoluna.
Kermit

2
O OP não declara que está reordenando as linhas existentes.
Kermit

Resposta completa e perfeita. Mas tenho uma dúvida de que, quando inserirmos um novo valor, qual será a PK desse valor. Se é 1 ou o próximo PK?
Prifulnath

sim esta é a melhor solução, mas você pode querer tabelas de bloqueio se houver dados sendo escrito por exemplo, tabelas de produção
wavvves

muito útil, eu tinha o mesmo requisito em que tive que redefinir o incremento automático para começar com 1, apenas os dois primeiros comandos ajudaram.
LOKENDRA


40

insira a descrição da imagem aquiExiste uma maneira muito fácil com o phpmyadmin na guia "operações", você pode definir, nas opções da tabela, o incremento automático para o número desejado.


Você precisa reiniciar o serviço / servidor mysql logo após isso.
Cibernético

1
Não acho que você precise reiniciar o servidor depois disso. O PhpAdmin apenas executará o comando para alterar o ponto inicial do incremento.
Kareem

Você não precisa reiniciar, ele entra em vigor a partir da próxima inserção.
precisa saber é o seguinte

36

A melhor solução que funcionou para mim:

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

É rápido, funciona com o innoDB e não preciso saber o valor máximo atual! Dessa forma, o contador de incremento automático será redefinido e iniciará automaticamente a partir do valor máximo existente.


1
ele definirá o valor NULL auto-inc em information_schema; checkSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
Eu testei na versão 5.6.x e isso funcionou perfeitamente, e a consulta de Kerem Güneş retornou o valor máximo mais um, NÃO nulo, conforme indicado. (talvez esteja definido como nulo após a primeira consulta, mas não após a segunda consulta). Acredito que esta seja a melhor solução para o InnoDB.
Frank Forte

O mesmo que o valor explícito definido: "crie uma nova tabela, com a mesma estrutura e o novo valor de incremento automático e copie todos os registros da tabela original, descarte o original e renomeie o novo. Isso pode ter um impacto considerável no desempenho (e espaço em disco) em ambientes de produção, se a tabela for grande. " mas muito pior porque precisa copiar a tabela completa duas vezes.
usar o seguinte comando

I verificar que isso funciona para a versão 5.6.15, enquanto que ALTER TABLE tablename AUTO_INCREMENT = 1faz não .
Nae

24

As respostas com a classificação mais alta para esta pergunta recomendam "ALTER yourtable AUTO_INCREMENT = value". No entanto, isso só funciona quando valueo alter é maior que o valor máximo atual da coluna de incremento automático. De acordo com a documentação do MySQL 8 :

Você não pode redefinir o contador para um valor menor ou igual ao valor atualmente em uso. Para o InnoDB e o MyISAM, se o valor for menor ou igual ao valor máximo atualmente na coluna AUTO_INCREMENT, o valor será redefinido para o valor máximo atual da coluna AUTO_INCREMENT mais um.

Em essência, você só pode alterar AUTO_INCREMENT para aumentar o valor da coluna de incremento automático, não redefini-lo para 1, conforme solicitado pelo OP na segunda parte da pergunta. Para opções que realmente permitem definir o AUTO_INCREMENT para baixo do seu máximo atual, consulte Reordenar / redefinir a chave primária de incremento automático .


20

Adicionando uma atualização porque a funcionalidade mudou no MySQL 5.6. No MySQL 5.6, você PODE usar a simples ALTER TABLE com o InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Os documentos são atualizados para refletir isso:

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

Meus testes também mostram que a tabela NÃO é copiada, o valor é simplesmente alterado.


19

Existem boas opções em Como redefinir a coluna de incremento automático do MySQL

Note-se que ALTER TABLE tablename AUTO_INCREMENT = value;se não trabalhar para InnoDB


8
Você como fazer isso com o InnoDB?
EmptyArsenal

4
Funciona bem para mim usando o MySQL v 5.6.2
Eddie B

Eu tive um problema semelhante em que um campo de incremento automático não estava sendo redefinido após excluir os registros de uma tabela. TRUNCATE parece ter funcionado. Acho que as soluções abaixo para remover o incremento automático e, em seguida, reaplicar podem ajudar a aliviar isso.
Craig Maloney

@CraigMaloney - DELETE(ou ROLLBACK) não recuperará IDs. Uma exceção: após uma reinicialização (ou falha), o próximo ID é calculado MAX(id)+1, recuperando efetivamente os IDs excluídos no final . Exceção à exceção: o MySQL 8.0 deixa esses IDs não utilizados.
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)

Usei isso em alguns dos meus scripts, o campo id é descartado e, em seguida, adicionado novamente com as configurações anteriores, todos os campos existentes na tabela do banco de dados são preenchidos com novos valores de incremento automático, isso também deve funcionar com o InnoDB.

Observe que todos os campos dentro da tabela serão recontados e terão outros IDs !!!.


3
Eu gostaria de ter algo assim! Mas como um aviso extra; isso obviamente quebraria completamente suas chaves estrangeiras.
NoobishPro

12

Você também pode usar a TRUNCATEtabela de sintaxe como esta: TRUNCATE TABLE table_name

Cuidado com o radar !! TRUNCATE TABLE your_tableirá apagar tudo no seu your_table!!


14
Novos programadores , esteja ciente de que TRUNCATEtambém excluirá TODAS as suas linhas na tabela especificada!
precisa saber é o seguinte

1
O comentário acima deve ser inserido na resposta, ou pelo menos uma explicação sobre o uso real de truncado.
precisa saber é o seguinte

TRUNCATEirá redefinir os auto_incrementcampos também? Meu caso de uso é limpar os dados antigos da tabela e iniciar os IDs de 1 novamente para novos dados (imagine, limpando a tabela para uso adequado após a conclusão do teste). Eu pensei que teria que ficar com DROPa mesa inteira e de CREATEnovo.
ADTC

Sim, TRUNCATE funciona como uma redefinição na mesa. Isso não é inteiramente verdade se uma tabela tiver sido ALTERADA desde a sua criação, essas alterações não serão redefinidas. Suponho que esteja mais perto de exportar a estrutura da tabela e usar a exportação para criar uma nova tabela que uma redefinição real.
19417 Chris

Sim @ADTC. Se você deseja manter o auto_incrementvalor atual , use em DELETE FROMvez de TRUNCATE.
TRiG 22/10/19

8

é para mesa vazia:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

Se você possui dados, mas deseja organizá-los, recomendo o seguinte:

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`);

simples de usar isso
Abdul Aziz Al Basyir

Isso funcionou para nós com dados. Redefine a linha para o próximo índice. Obrigado!
Dazzle

urwell @Dazzle!
Abdul Aziz Al Basyir 18/03

5

Aqui está minha solução, mas não aconselho fazer isso se sua coluna tiver restrições ou estiver conectada como chave estrangeira a outras tabelas, pois isso teria efeitos negativos ou nem funcionaria.

> Primeiro: solte a coluna

ALTER TABLE tbl_name DROP COLUMN column_id

> Segundo: recrie a coluna e defina-a como PRIMEIRO, se você quiser que seja a primeira coluna que eu assumo.

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

Isso funciona bem!


3

No MySQL 5.6, a abordagem abaixo funciona mais rapidamente devido ao DDL online (nota algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;


2

Você pode simplesmente truncar a tabela para redefinir a sequência

TRUNCATE TABLE TABLE_NAME

1

Tentei alterar a tabela e definir auto_increment como 1, mas não funcionou. Resolvi excluir o nome da coluna que estava incrementando, criar uma nova coluna com o seu nome preferido e definir essa nova coluna para incrementar desde o início.


você poderia explicar como você fez isso acontecer?
MZaragoza

@MZaragoza Basta soltar a coluna antiga que não tem IA e criar uma nova que tenha a IA ativada.
andromeda

Você pode atualizar sua resposta para mostrar isso. Eu realmente aprecio isso
MZaragoza

1

O contador de incremento automático para uma tabela pode ser (re) definido de duas maneiras:

  1. Executando uma consulta, como outros já explicados:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Usando o Workbench ou outra ferramenta visual de design de banco de dados. Vou mostrar no Workbench como isso é feito - mas também não deve ser muito diferente em outras ferramentas. Clique com o botão direito do mouse na tabela desejada e escolha Alter tableno menu de contexto. Na parte inferior, você pode ver todas as opções disponíveis para alterar uma tabela. Escolha Optionse você receberá este formulário: insira a descrição da imagem aqui

    Em seguida, basta definir o valor desejado no campo, Auto incrementcomo mostrado na imagem. Basicamente, isso executará a consulta mostrada na primeira opção.


0

Para atualizar o mais recente mais um ID

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


0

Pesquisei no Google e encontrei essa pergunta, mas a resposta que estou procurando realmente preenche dois critérios:

  1. usando consultas puramente MySQL
  2. redefina um incremento automático da tabela existente para max (id) + 1

Como não consegui encontrar exatamente o que quero aqui, juntei a resposta de várias respostas e a compartilhei aqui.

Algumas coisas a serem observadas:

  1. a tabela em questão é o InnoDB
  2. a tabela usa o campo idcom o tipo como intchave primária
  3. a única maneira de fazer isso puramente no MySQL é usar o procedimento armazenado
  4. minhas imagens abaixo estão usando SequelPro como a GUI. Você deve poder adaptá-lo com base no seu editor MySQL preferido
  5. Eu testei isso no MySQL Ver 14.14 Distrib 5.5.61, para debian-linux-gnu

Etapa 1: Criar procedimento armazenado

crie um procedimento armazenado 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 ;

Então execute.

Antes da execução, fica assim quando você olha em Procedimentos armazenados no seu banco de dados.

insira a descrição da imagem aqui

Quando executo, basta selecionar o procedimento armazenado e pressionar Executar seleção

insira a descrição da imagem aqui

Nota: a parte dos delimitadores é crucial. Portanto, se você copiar e colar das principais respostas selecionadas nesta pergunta, elas tendem a não funcionar por esse motivo.

Depois de executar, devo ver o procedimento armazenado

insira a descrição da imagem aqui

Se você precisar alterar o procedimento armazenado, exclua o procedimento armazenado e selecione para executar novamente.

Etapa 2: chamar o procedimento armazenado

Desta vez, você pode simplesmente usar consultas normais do MySQL.

call reset_autoincrement('products');

Originalmente, a partir das minhas próprias consultas SQL, observe em https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc e adaptado para StackOverflow


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

-1

Tente executar esta consulta

 ALTER TABLE tablename AUTO_INCREMENT = value;

Ou tente esta consulta para o incremento automático de redefinição

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

E defina o incremento automático e execute esta consulta

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

-2

Sugiro que você vá ao Query Browser e faça o seguinte:

  1. Vá para esquemas e encontre a tabela que deseja alterar.
  2. Clique com o botão direito e selecione copiar instrução de criação.
  3. Abra uma guia de resultados e cole a instrução create deles.
  4. Vá para a última linha da instrução create e procure o Auto_Increment = N, (Onde N é o número atual do campo auto_increment.)
  5. Substitua N por 1.
  6. Pressione ctrl+enter .

O incremento automático deve ser redefinido para um assim que você inserir uma nova linha na tabela.

Não sei o que acontecerá se você tentar adicionar uma linha em que já exista um valor de campo auto_increment.

Espero que esta ajuda!


-2

A melhor maneira é remover o campo com AI e adicioná-lo novamente com AI, funciona para todas as tabelas


1
não a melhor maneira em tudo, deixando cair uma coluna vai perder os dados da coluna
Disha Goyal
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.