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.
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.
Respostas:
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 .
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
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:
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.
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 para TRUNCATE
todas as tabelas, em oposição a apenas algumas centenas de milissegundos para DELETE
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.