Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để cắt bớt một bảng bằng Doctrine 2?

Cẩn thận với các bảng cắt ngắn

Cẩn thận với việc cắt bớt bảng trong bất kỳ RDBMS nào, đặc biệt nếu bạn muốn sử dụng các giao dịch rõ ràng cho chức năng cam kết / khôi phục. Vui lòng đọc 'Đề xuất của tôi' về câu trả lời này.

Các câu lệnh DDL thực hiện một cam kết ngầm

Câu lệnh bảng cắt ngắn là câu lệnh ngôn ngữ định nghĩa dữ liệu (DDL) và như vậy câu lệnh bảng cắt ngắn kích hoạt một COMMIT ngầm định vào cơ sở dữ liệu khi chúng thực thi . Nếu bạn thực hiện TABLE TRUNCATE thì cơ sở dữ liệu được cam kết ngầm - ngay cả khi TABLE TRUNCATE nằm trong START TRANSACTION câu lệnh - bảng của bạn sẽ bị cắt bớt và một ROLLBACK sẽ không khôi phục nó.

Vì các câu lệnh trong bảng cắt ngắn thực hiện các cam kết ngầm, câu trả lời của Maxence không hoạt động như mong đợi (nhưng nó không sai, bởi vì câu hỏi là "làm thế nào để cắt ngắn một bảng"). Câu trả lời của anh ta không hoạt động như mong đợi vì nó cắt ngắn bảng trong một try và giả định rằng bảng có thể được khôi phục trong catch chặn, nếu có sự cố. Đây là một giả định không chính xác.


Nhận xét và trải nghiệm của người dùng khác trong chuỗi này

ChrisAelbrecht không thể làm cho giải pháp của Maxence hoạt động bình thường vì bạn không thể khôi phục câu lệnh bảng cắt ngắn, ngay cả khi câu lệnh bảng cắt ngắn nằm trong một giao dịch rõ ràng.

Thật không may, user2130519 đã bị phản đối (-1 cho đến khi tôi ủng hộ) vì đã đưa ra câu trả lời chính xác - mặc dù anh ta đã làm như vậy mà không giải thích cho câu trả lời của mình, điều này giống như làm toán mà không hiển thị bài làm của bạn.


Đề xuất của tôi DELETE FROM

Khuyến nghị của tôi là sử dụng DELETE FROM . Trong hầu hết các trường hợp, nó sẽ hoạt động như nhà phát triển mong đợi. Nhưng, DELETE FROM không phải không có nhược điểm - bạn phải đặt lại rõ ràng giá trị tăng tự động cho bảng. Để đặt lại giá trị tăng tự động cho bảng, bạn phải sử dụng một câu lệnh DDL khác - ALTER TABLE --và, một lần nữa, không sử dụng ALTER TABLE trong try của bạn khối. Nó sẽ không hoạt động như mong đợi.

Nếu bạn muốn biết các mẹo về thời điểm bạn nên sử dụng DELETE FROM so với TRUNCATE xem Ưu và nhược điểm của TRUNCATE so với DELETE FROM .


Nếu bạn thực sự phải làm, đây là cách cắt bớt

Bây giờ, với tất cả những gì đã nói. Nếu bạn thực sự muốn cắt ngắn một bảng bằng Doctrine2, hãy sử dụng điều này:(Dưới đây là phần câu trả lời của Maxence đã cắt một bảng một cách chính xác)

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


Cách xóa bảng có chức năng rollback / commit.

Tuy nhiên, nếu bạn muốn có chức năng khôi phục / cam kết, bạn phải sử dụng DELETE FROM :(Dưới đây là phiên bản sửa đổi của câu trả lời của 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();
}

Nếu bạn cần đặt lại giá trị tăng tự động, hãy nhớ gọi 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. Cách in Datagridview có bảng trong VB

  2. mysql_fetch_array () mong đợi tham số 1 là vấn đề tài nguyên

  3. Cách hoạt động của hàm LPAD () trong MySQL

  4. trả về số hàng ban đầu của mySQL

  5. MySqlConnectionStringBuilder - Kết nối với chứng chỉ