Waspadalah terhadap Pemotongan Tabel
Waspadalah terhadap pemotongan tabel di RDBMS apa pun, terutama jika Anda ingin menggunakan transaksi eksplisit untuk fungsionalitas komit/kembalikan. Silakan baca 'Rekomendasi saya' dari jawaban ini.
Pernyataan DDL melakukan komitmen implisit
Pernyataan tabel terpotong adalah pernyataan bahasa definisi data (DDL), dan karena itu pernyataan tabel terpotong memicu COMMIT
implisit ke database setelah dieksekusi . Jika Anda melakukan TABLE TRUNCATE
maka database secara implisit berkomitmen untuk--bahkan jika TABLE TRUNCATE
berada dalam START TRANSACTION
pernyataan--tabel Anda akan terpotong dan ROLLBACK
akan tidak pulihkan.
Karena pernyataan tabel terpotong melakukan komitmen implisit, jawaban Maxence tidak berjalan seperti yang diharapkan (tapi itu tidak salah, karena pertanyaannya adalah "bagaimana cara memotong tabel"). Jawabannya tidak bekerja seperti yang diharapkan karena itu memotong tabel dalam try
blok, dan mengasumsikan bahwa tabel dapat dipulihkan di catch
blok, jika terjadi kesalahan. Ini adalah asumsi yang salah.
Komentar &pengalaman pengguna lain di utas ini
ChrisAelbrecht tidak dapat membuat solusi Maxence berfungsi dengan baik karena Anda tidak dapat mengembalikan pernyataan tabel terpotong, bahkan jika pernyataan tabel terpotong dalam transaksi eksplisit.
user2130519, sayangnya, diturunkan (-1 sampai saya memilih) karena memberikan jawaban yang benar--walaupun dia melakukannya tanpa membenarkan jawabannya, seperti mengerjakan matematika tanpa menunjukkan pekerjaan Anda.
Rekomendasi saya DELETE FROM
Rekomendasi saya adalah menggunakan DELETE FROM
. Dalam kebanyakan kasus, itu akan berfungsi seperti yang diharapkan pengembang. Tapi, DELETE FROM
tidak datang tanpa kekurangan baik--Anda harus secara eksplisit mengatur ulang nilai kenaikan otomatis untuk tabel. Untuk menyetel ulang nilai kenaikan otomatis untuk tabel, Anda harus menggunakan pernyataan DDL lain--ALTER TABLE
--dan, sekali lagi, jangan gunakan ALTER TABLE
di try
memblokir. Ini tidak akan bekerja seperti yang diharapkan.
Jika Anda ingin tips tentang kapan Anda harus menggunakan DELETE FROM
vs TRUNCATE
lihat Pro &Kontra TRUNCATE vs DELETE FROM .
Jika Anda benar-benar harus melakukannya, berikut cara memotongnya
Sekarang, dengan semua yang dikatakan. Jika Anda benar-benar ingin memotong tabel menggunakan Doctrine2, gunakan ini:(Di bawah ini adalah bagian dari jawaban Maxence yang memotong tabel dengan benar)
$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');
Cara menghapus tabel dengan fungsi rollback/commit.
Namun, jika Anda ingin mengembalikan/melakukan fungsionalitas, Anda harus menggunakan DELETE FROM
:(Di bawah ini adalah versi modifikasi dari jawaban 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();
}
Jika Anda perlu mengatur ulang nilai kenaikan otomatis, ingatlah untuk memanggil ALTER TABLE <tableName> AUTO_INCREMENT = 1
.