Achten Sie auf das Abschneiden von Tabellen
Hüten Sie sich vor dem Abschneiden von Tabellen in RDBMS, insbesondere wenn Sie explizite Transaktionen für Commit/Rollback-Funktionen verwenden möchten. Bitte lesen Sie den Abschnitt „Meine Empfehlung“ dieser Antwort.
DDL-Anweisungen führen ein implizites Commit durch
Truncate-Table-Anweisungen sind Data Definition Language (DDL)-Anweisungen, und als solche lösen Truncate-Table-Anweisungen ein implizites COMMIT
aus in die Datenbank nach ihrer Ausführung . Wenn Sie ein TABLE TRUNCATE
durchführen dann wird die Datenbank implizit festgeschrieben – selbst wenn die TABLE TRUNCATE
innerhalb einer START TRANSACTION
ist -Anweisung - Ihre Tabelle wird abgeschnitten und ein ROLLBACK
wird nicht wiederherstellen.
Da truncate table-Anweisungen implizite Commits ausführen, verhält sich die Antwort von Maxence nicht wie erwartet (aber es ist nicht falsch, denn die Frage war "wie man eine Tabelle abschneidet"). Seine Antwort funktioniert nicht wie erwartet, weil sie die Tabelle in einem try
abschneidet block und geht davon aus, dass die Tabelle im catch
wiederhergestellt werden kann blockieren, wenn etwas schief geht. Dies ist eine falsche Annahme.
Kommentare und Erfahrungen anderer Benutzer in diesem Thread
Chris Aelbrecht war nicht in der Lage, die Lösung von Maxence richtig zum Laufen zu bringen, da Sie eine Anweisung zum Abschneiden von Tabellen nicht rückgängig machen können, selbst wenn sich die Anweisung zum Abschneiden von Tabellen in einer expliziten Transaktion befindet.
Benutzer2130519 wurde leider herabgestuft (-1, bis ich hochgestuft habe), weil er die richtige Antwort gegeben hat – obwohl er dies tat, ohne seine Antwort zu rechtfertigen, was so ist, als würde man rechnen, ohne seine Arbeit zu zeigen.
Meine Empfehlung DELETE FROM
Meine Empfehlung ist die Verwendung von DELETE FROM
. In den meisten Fällen wird es so funktionieren, wie der Entwickler es erwartet. Aber DELETE FROM
ist auch nicht ohne Nachteile - Sie müssen den Auto-Inkrementwert für die Tabelle explizit zurücksetzen. Um den automatischen Inkrementwert für die Tabelle zurückzusetzen, müssen Sie eine andere DDL-Anweisung verwenden – ALTER TABLE
--und verwenden Sie wieder nicht ALTER TABLE
in Ihrem try
Block. Es wird nicht wie erwartet funktionieren.
Wenn Sie Tipps wünschen, wann Sie DELETE FROM
verwenden sollten vs TRUNCATE
siehe Vor- und Nachteile von TRUNCATE vs. DELETE FROM .
Wenn Sie wirklich müssen, hier ist, wie man kürzt
Nun, mit allem, was gesagt wurde. Wenn Sie wirklich eine Tabelle mit Doctrine2 kürzen möchten, verwenden Sie Folgendes:(Unten ist der Teil von Maxences Antwort, der eine Tabelle korrekt kürzt)
$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');
So löschen Sie eine Tabelle mit Rollback-/Commit-Funktionalität.
Wenn Sie jedoch eine Rollback-/Commit-Funktionalität wünschen, müssen Sie DELETE FROM
verwenden :(Unten ist eine modifizierte Version von Maxences Antwort.)
$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();
}
Wenn Sie den Wert für das automatische Inkrement zurücksetzen müssen, denken Sie daran, ALTER TABLE <tableName> AUTO_INCREMENT = 1
aufzurufen .