Cuidado com tabelas truncadas
Cuidado com o truncamento de tabelas em qualquer RDBMS, especialmente se você quiser usar transações explícitas para a funcionalidade de confirmação/reversão. Por favor, leia a 'Minha recomendação' desta resposta.
As instruções DDL executam um commit implícito
As instruções de truncamento de tabela são instruções de linguagem de definição de dados (DDL) e, como tal, instruções de truncar de tabela acionam um
COMMIT
implícito para o banco de dados após sua execução . Se você executar um TABLE TRUNCATE
então o banco de dados está implicitamente comprometido -- mesmo se o TABLE TRUNCATE
está dentro de uma START TRANSACTION
instrução--sua tabela será truncada e um ROLLBACK
não restaurá-lo. Como as instruções truncate table executam commits implícitos, a resposta de Maxence não funciona conforme o esperado (mas não está errado, pois a pergunta era "como truncar uma tabela"). Sua resposta não funciona como esperado porque trunca a tabela em um
try
bloco, e assume que a tabela pode ser restaurada no catch
bloquear, se algo der errado. Esta é uma suposição incorreta. Comentários e experiências de outros usuários neste tópico
ChrisAelbrecht não conseguiu fazer com que a solução de Maxence funcionasse corretamente porque você não pode reverter uma instrução truncate table, mesmo que a instrução truncate table esteja em uma transação explícita.
user2130519, infelizmente, foi reprovado (-1 até que eu votei a favor) por fornecer a resposta correta - embora ele tenha feito isso sem justificar sua resposta, que é como fazer contas sem mostrar seu trabalho.
Minha recomendação DELETE FROM
Minha recomendação é usar
DELETE FROM
. Na maioria dos casos, ele funcionará como o desenvolvedor espera. Mas, DELETE FROM
também não vem sem desvantagens - você deve redefinir explicitamente o valor de incremento automático para a tabela. Para redefinir o valor de incremento automático para a tabela, você deve usar outra instrução DDL--ALTER TABLE
--e, novamente, não use ALTER TABLE
em seu try
quadra. Não funcionará como esperado. Se você quiser dicas sobre quando usar
DELETE FROM
vs TRUNCATE
veja Prós e contras de TRUNCATE vs DELETE FROM . Se você realmente precisa, veja como truncar
Agora, com tudo isso dito. Se você realmente deseja truncar uma tabela usando o Doctrine2, use isto:(Abaixo está a parte da resposta de Maxence que trunca corretamente uma tabela)
$cmd = $em->getClassMetadata($className);
$connection = $em->getConnection();
$dbPlatform = $connection->getDatabasePlatform();
$connection->query('SET FOREIGN_KEY_CHECKS=0');
$q = $dbPlatform->getTruncateTableSql($cmd->getTableName());
$connection->executeUpdate($q);
$connection->query('SET FOREIGN_KEY_CHECKS=1');
Como excluir uma tabela com a funcionalidade rollback/commit.
Mas, se você quiser a funcionalidade de rollback/commit, você deve usar
DELETE FROM
:(Abaixo está uma versão modificada da resposta de Maxence.) $cmd = $em->getClassMetadata($className);
$connection = $em->getConnection();
$connection->beginTransaction();
try {
$connection->query('SET FOREIGN_KEY_CHECKS=0');
$connection->query('DELETE FROM '.$cmd->getTableName());
// Beware of ALTER TABLE here--it's another DDL statement and will cause
// an implicit commit.
$connection->query('SET FOREIGN_KEY_CHECKS=1');
$connection->commit();
} catch (\Exception $e) {
$connection->rollback();
}
Se você precisar redefinir o valor de incremento automático, lembre-se de chamar
ALTER TABLE <tableName> AUTO_INCREMENT = 1
.