Mysql
 sql >> Database >  >> RDS >> Mysql

Come troncare una tabella usando Doctrine 2?

Attenzione al troncamento delle tabelle

Fai attenzione al troncamento delle tabelle in qualsiasi RDBMS, soprattutto se desideri utilizzare transazioni esplicite per la funzionalità di commit/rollback. Si prega di leggere la "Mia raccomandazione" di questa risposta.

Le istruzioni DDL eseguono un commit implicito

Le istruzioni di tabella tronca sono istruzioni DDL (Data Definition Language) e in quanto tali le istruzioni di tabella tronca attivano un COMMIT implicito al database al momento della loro esecuzione . Se esegui un TABLE TRUNCATE quindi il database è implicitamente impegnato, anche se il TABLE TRUNCATE è all'interno di un START TRANSACTION istruzione:la tabella verrà troncata e verrà visualizzato un ROLLBACK non ripristinalo.

Poiché le istruzioni tronca la tabella eseguono commit impliciti, La risposta di Maxence non funziona come previsto (ma non è sbagliato, perché la domanda era "come troncare una tabella"). La sua risposta non funziona come previsto perché tronca la tabella in un try blocco e presuppone che la tabella possa essere ripristinata nel catch bloccare, se qualcosa va storto. Questa è un'ipotesi errata.


Commenti ed esperienze di altri utenti in questo thread

ChrisAelbrecht non è stato in grado di far funzionare correttamente la soluzione di Maxence perché non è possibile eseguire il rollback di un'istruzione truncate table, anche se l'istruzione truncate table si trova in una transazione esplicita.

user2130519, sfortunatamente, è stato sottoposto a downvoting (-1 fino a quando non ho votato a favore) per aver fornito la risposta corretta, anche se lo ha fatto senza giustificare la sua risposta, il che è come fare matematica senza mostrare il tuo lavoro.


Il mio consiglio DELETE FROM

Il mio consiglio è di usare DELETE FROM . Nella maggior parte dei casi, funzionerà come si aspetta lo sviluppatore. Ma, DELETE FROM non viene nemmeno senza inconvenienti:è necessario reimpostare esplicitamente il valore di incremento automatico per la tabella. Per reimpostare il valore di incremento automatico per la tabella, è necessario utilizzare un'altra istruzione DDL--ALTER TABLE --e, ancora, non usare ALTER TABLE nel tuo try bloccare. Non funzionerà come previsto.

Se desideri suggerimenti su quando utilizzare DELETE FROM vs TRUNCATE vedi Pro e contro di TRUNCATE vs DELETE FROM .


Se proprio devi, ecco come troncare

Ora, con tutto ciò che è stato detto. Se vuoi davvero troncare una tabella usando Doctrine2, usa questo:(Di seguito è riportata la parte della risposta di Maxence che tronca correttamente una tabella)

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


Come eliminare una tabella con funzionalità di rollback/commit.

Ma, se vuoi la funzionalità di rollback/commit, devi usare DELETE FROM :(Di seguito è riportata una versione modificata della risposta di 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 è necessario reimpostare il valore di incremento automatico, ricordarsi di chiamare ALTER TABLE <tableName> AUTO_INCREMENT = 1 .