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
.