sql >> データベース >  >> RDS >> Mysql

Doctrine 2を使用してテーブルを切り捨てる方法は?

    テーブルの切り捨てに注意

    特にコミット/ロールバック機能に明示的なトランザクションを使用する場合は、RDBMSでテーブルを切り捨てることに注意してください。この回答の「私の推奨事項」をお読みください。

    DDLステートメントは暗黙的なコミットを実行します

    テーブルの切り捨てステートメントはデータ定義言語(DDL)ステートメントであるため、テーブルの切り捨てステートメントは暗黙のCOMMITをトリガーします。 実行時にデータベースにTABLE TRUNCATEを実行する場合 TABLE TRUNCATEであっても、データベースは暗黙的にコミットされます。 START TRANSACTION内にあります ステートメント-テーブルは切り捨てられ、ROLLBACK しない 復元します。

    truncate tableステートメントは暗黙的なコミットを実行するため、Maxenceの回答は期待どおりに実行されません (しかし、問題は「テーブルを切り捨てる方法」だったので、間違いではありません)。 tryでテーブルが切り捨てられるため、彼の回答は期待どおりに機能しません。 ブロックし、テーブルがcatchで復元できることを前提としています 何かがうまくいかない場合は、ブロックします。これは誤った仮定です。


    このスレッドでの他のユーザーのコメントと経験

    切り捨てテーブルステートメントが明示的なトランザクションにある場合でも、切り捨てテーブルステートメントをロールバックできないため、ChrisAelbrechtはMaxenceのソリューションを正しく機能させることができませんでした。

    user2130519は、残念ながら、正解を提供したことで反対票を投じました(私が賛成するまでは-1)。ただし、彼は答えを正当化せずにそうしました。これは、あなたの仕事を見せずに数学を行うようなものです。


    私の推奨事項DELETE FROM

    DELETE FROMを使用することをお勧めします 。ほとんどの場合、開発者が期待するとおりに機能します。ただし、DELETE FROM 欠点もあります。テーブルの自動増分値を明示的にリセットする必要があります。テーブルの自動インクリメント値をリセットするには、別のDDLステートメント(ALTER TABLE)を使用する必要があります -また、ALTER TABLEは使用しないでください try ブロック。期待どおりに機能しません。

    DELETE FROMをいつ使用すべきかについてのヒントが必要な場合 vs TRUNCATE TRUNCATEとDELETEFROMの長所と短所


    本当に必要な場合は、ここで切り捨てる方法を説明します

    さて、そうは言っても。 Doctrine2を使用してテーブルを本当に切り捨てたい場合は、次を使用します:(以下はテーブルを正しく切り捨てるMaxenceの回答の部分です)

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


    ロールバック/コミット機能を使用してテーブルを削除する方法。

    ただし、ロールバック/コミット機能が必要な場合は、DELETE FROMを使用する必要があります :(以下は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();
    }
    

    自動増分値をリセットする必要がある場合は、ALTER TABLE <tableName> AUTO_INCREMENT = 1を呼び出すことを忘れないでください。 。



    1. 指定されたmysqlホストのいずれにも接続できません。 C#MySQL

    2. さまざまなエラー処理手法のパフォーマンスへの影響

    3. MySQLでINSERT...SELECTを使用して列の値を追加する

    4. SQLiteケース