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.
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.
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:
@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 checkSET AUTOCOMMIT =0;-- disable autocommitSTARTTRANSACTION;-- 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 checkCOMMIT;-- make a commitSET AUTOCOMMIT =1;
Mas a diferença estará no tempo de execução. Veja acima a resposta de Sorin.
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.
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:fonte
DELETE FROM tablename;
(mas isso não vai funcionar bem quando há restrições de FK - consulte stackoverflow.com/a/5452798/507761 )Se a tabela tiver chaves estrangeiras, eu sempre uso o seguinte código:
Mas a diferença estará no tempo de execução. Veja acima a resposta de Sorin.
fonte
Um fato interessante.
Eu tinha certeza de que
TRUNCATE
terá 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 paraTRUNCATE
todas as tabelas, em oposição a apenas algumas centenas de milissegundos paraDELETE
o 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.
fonte
se você quiser usar,
truncate
use isto:fonte