テーブルの切り捨てに注意
特にコミット/ロールバック機能に明示的なトランザクションを使用する場合は、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の長所と短所を参照してください。 a> 。
本当に必要な場合は、ここで切り捨てる方法を説明します
さて、そうは言っても。 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
を呼び出すことを忘れないでください。 。