Olá!!!
[Um dos meus trabalhos atuais](http://www.ead.ufsc.br) envolve passar um bom tempo na frente do shell do MySQL, testando e re-testando consultas para sincronizar dois bancos de dados distintos.
Ontem mesmo fui remover todos os campos de uma tabela, para re-testar uma dessas consultas e fui aconselhado pelo meu parceiro de trabalho a usar o `TRUNCATE` ao invés do `DELETE`. Na hora ele não soube me dizer exatamente qual a diferença entre os dois, exceto que o `TRUNCATE` fazia uma série de limpezas a mais.
Hoje fui ver o [manual](http://dev.mysql.com/doc/refman/5.0/en/truncate.html) pra ver o que realmente muda.
Exceto nas tabelas [InnoDB](http://www.innodb.com/), o `TRUNCATE` faz o seguinte:
* Remove e re-cria a tabela
* Não é seguro em transações: se você está no meio de uma transação ou de um `table lock`, receberá um erro
* Não retorna o número de linhas removidas
* Se você tem um arquivo `tbl_name.frm` válido, a tabela poderá ser recriada vazia mesmo que os dados estejam corrompidos
* O gerenciador de tabelas não se lembrará do último valor `AUTO_INCREMENT` usado. Ou seja, as novas inserções começarão do início novamente. (Essa vale tanto pra **MyISAM** quanto para **InnoDB**)
* Como o `TRUNCATE` não usa o `DELETE` os gatilhos(triggers) `ON DELETE` não serão acionados.
É isso aí… realmente tudo o que eu queria para limpar as tabelas e continuar testando em paz…
