Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara memotong tabel menggunakan Doctrine 2?

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Meng-upgrade MySQL di CentOS

  2. INSERT dan SELECT dalam satu query MySQL

  3. Memahami Deadlock di MySQL &PostgreSQL

  4. Pernyataan SELECT yang digunakan memiliki jumlah kolom yang berbeda (REDUX!!)

  5. Cara mengaktifkan INNODB di mysql