MySQL Exclua todas as linhas da tabela e redefina o ID para zero

183

Preciso excluir todas as linhas de uma tabela, mas quando adiciono uma nova linha, desejo que o ID da chave primária, que possui um incremento automático, comece novamente de 0, respectivamente, de 1.

marek_lani
fonte

Respostas:

304

Não exclua, use truncar:

Truncate table XXX

O manipulador de tabela não se lembra do último valor AUTO_INCREMENT usado, mas começa a contar desde o início. Isso é verdade mesmo para MyISAM e InnoDB, que normalmente não reutilizam valores de sequência.

Fonte .

François
fonte
20
Truncar funciona bem com tabelas não restritas, mas se sua tabela tiver uma restrição de chave estrangeira, considere usar o método Delete. Veja este post se você tiver restrições FK: chave estrangeira truncar constrangidos mesa
Julian Soro
1
lembre-se que a tabela truncada não vai reverter
centavo chan
83

Se você não puder usar TRUNCATE(por exemplo, devido a restrições de chave estrangeira), poderá usar uma tabela de alteração após excluir todas as linhas para reiniciar o auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1
um cavalo sem nome
fonte
3
@NBhargav Como você pode estar usando o mecanismo InnoDB na sua mesa em vez do MyISAM, o primeiro não suporta a redefinição do índice.
Gustavo Rubio
como excluir todas as linhas antes de alterar o valor auto_increment
Kasun Siyambalapitiya
@KasunSiyambalapitiya DELETE FROM tablename;(mas isso não vai funcionar bem quando há restrições de FK - consulte stackoverflow.com/a/5452798/507761 )
Matthew Leia
17

Se a tabela tiver chaves estrangeiras, eu sempre uso o seguinte código:

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

Mas a diferença estará no tempo de execução. Veja acima a resposta de Sorin.

preto
fonte
2
Essa é uma boa maneira de ter dados órfãos em qualquer tabela com chaves estrangeiras para a tabela que você está eliminando. Habilitar as verificações de chave estrangeira após o fato não faz com que o MySQL revalide essas chaves estrangeiras, tanto quanto eu saiba. Isso deixa você com linhas que contêm dados que não existem na tabela de referência. Você também pode nem ter chaves estrangeiras na sua mesa.
Cimmanon
8

Um fato interessante.

Eu tinha certeza de que TRUNCATEterá sempre um desempenho melhor, mas no meu caso, para um banco de dados com cerca de 30 tabelas com chaves estrangeiras, povoadas com apenas algumas linhas, que demorou cerca de 12 segundos para TRUNCATEtodas as tabelas, em oposição a apenas algumas centenas de milissegundos para DELETEo linhas. Definir o incremento automático adiciona cerca de um segundo no total, mas ainda é muito melhor.

Então, eu sugiro tentar as duas, ver o que funciona mais rápido para o seu caso.

Sorin
fonte
2

se você quiser usar, truncateuse isto:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
david2020
fonte