sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo truncar una tabla usando Doctrine 2?

Cuidado con las tablas truncadas

Tenga cuidado con las tablas truncadas en cualquier RDBMS, especialmente si desea utilizar transacciones explícitas para la funcionalidad de confirmación/reversión. Lea "Mi recomendación" de esta respuesta.

Las sentencias DDL realizan una confirmación implícita

Las sentencias de tabla truncada son sentencias de lenguaje de definición de datos (DDL) y, como tales, las sentencias de tabla truncada desencadenan un COMMIT implícito. a la base de datos tras su ejecución . Si realiza un TABLE TRUNCATE entonces la base de datos está comprometida implícitamente, incluso si TABLE TRUNCATE está dentro de un START TRANSACTION instrucción:su tabla se truncará y aparecerá un ROLLBACK no restaurarlo.

Debido a que las sentencias de tabla truncada realizan confirmaciones implícitas, la respuesta de Maxence no funciona como se esperaba (pero no está mal, porque la pregunta era "cómo truncar una tabla"). Su respuesta no funciona como se esperaba porque trunca la tabla en un try bloque, y asume que la tabla se puede restaurar en el catch bloquear, si algo sale mal. Esta es una suposición incorrecta.


Comentarios y experiencias de otros usuarios en este hilo

ChrisAelbrecht no pudo hacer que la solución de Maxence funcionara correctamente porque no se puede deshacer una declaración de tabla truncada, incluso si la declaración de tabla truncada está en una transacción explícita.

El usuario 2130519, desafortunadamente, recibió un voto negativo (-1 hasta que voté a favor) por proporcionar la respuesta correcta, aunque lo hizo sin justificar su respuesta, que es como hacer matemáticas sin mostrar su trabajo.


Mi recomendación DELETE FROM

Mi recomendación es usar DELETE FROM . En la mayoría de los casos, funcionará como espera el desarrollador. Pero, DELETE FROM tampoco viene sin inconvenientes:debe restablecer explícitamente el valor de incremento automático para la tabla. Para restablecer el valor de incremento automático para la tabla, debe usar otra instrucción DDL:ALTER TABLE --y, de nuevo, no uses ALTER TABLE en tu try cuadra. No funcionará como se esperaba.

Si desea consejos sobre cuándo debe usar DELETE FROM vs TRUNCATE consulte Pros y contras de TRUNCATE vs DELETE FROM .


Si realmente debe hacerlo, así es como se trunca

Ahora, con todo lo dicho. Si realmente desea truncar una tabla usando Doctrine2, use esto:(A continuación se muestra la parte de la respuesta de Maxence que trunca correctamente una tabla)

$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');


Cómo eliminar una tabla con funcionalidad de reversión/confirmación.

Pero, si desea la funcionalidad de retroceder/confirmar, debe usar DELETE FROM :(A continuación se muestra una versión modificada de la respuesta 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();
}

Si necesita restablecer el valor de incremento automático, recuerde llamar a ALTER TABLE <tableName> AUTO_INCREMENT = 1 .