Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kürze ich eine Tabelle mit Lehre 2?

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 .