Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como truncar uma tabela usando o Doctrine 2?

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 .