Sự khác biệt giữa DROP và TRUNCATE


8

Làm gì TRUNCATEkhác nhau để thả?

Tôi tin rằng nó sẽ xóa tất cả dữ liệu trong bảng nhưng vẫn giữ tên bảng trong cơ sở dữ liệu, trong đó khi DROPxóa tất cả dữ liệu và bảng. Điều này có đúng không?


Liên quan (và có lẽ rất nhiều các khái niệm sẽ tương tự hoặc giống hệt nhau, ngay cả khi không phải tất cả các chi tiết tốt là): dba.stackexchange.com/questions/30325/delete-vs-truncate
Aaron Bertrand

Câu trả lời:


22

XÓA - NGÔN NGỮ DỮ LIỆU DỮ LIỆU (DML)

Câu DELETElệnh trong bất kỳ RDBMS nào được coi là câu lệnh DML . Còn được gọi là CRUD (Tạo, Đọc, Cập nhật, Xóa), loại câu lệnh này nhằm thao túng dữ liệu trong cơ sở dữ liệu mà không ảnh hưởng đến cấu trúc cơ bản của các đối tượng. Điều này có nghĩa là gì trong thực tế là:

  • Một DELETEcâu lệnh có thể được điều chỉnh bằng cách sử dụng một vị từ thông qua WHEREhoặc JOINđể xóa một số hoặc tất cả các hàng trong một bảng.
  • Một DELETEcâu lệnh sẽ được ghi lại bởi cơ sở dữ liệu và có thể được khôi phục trong một giao dịch nếu câu lệnh thất bại.
  • Thông thường, DELETEsẽ có các khóa cấp hàng trên dữ liệu bị xóa, mặc dù điều này có thể leo thang cao hơn khi cần thiết.
  • Do chi phí giao dịch, DELETEcó thể "chậm" (điều này là tương đối), nhưng an toàn hơn vì nó là hạt mịn.

TRUNCATE - NGÔN NGỮ ĐỊNH NGHATA DỮ LIỆU (DDL)

TRUCNATEđược coi là một câu lệnh DDL , có nghĩa là nó được dự định để thay đổi cách xác định các đối tượng trong cơ sở dữ liệu. Thông thường, các câu lệnh DDL là CREATE, ALTERhoặc DROP, nhưng TRUNCATEphục vụ một mục đích cụ thể, đó là "tái định cư" một bảng bằng cách xóa tất cả các hàng. Các phương thức này khác nhau giữa các công cụ RDBMS và tôi khuyên bạn nên xem xét các chi tiết cụ thể của MySQL . Ý nghĩa thực tế của a TRUNCATElà:

  • TRUNCATEkhông thể là hạt mịn. Nếu thành công, nó sẽ xóa tất cả các hàng khỏi bảng của bạn.
  • TRUNCATEthường không được đăng nhập. Điều này thay đổi theo RDBMS và tôi sẽ đề nghị bạn xem xét cụ thể hơn về cách MySQL xử lý nó. (Gợi ý, nó thay đổi theo phiên bản.)
  • TRUNCATEyêu cầu khóa siêu dữ liệu bảng để thực thi. Làm thế nào điều này thực sự được triển khai có thể cụ thể đối với RDBMS, nhưng về cơ bản, TRUNCATEquá trình này phải ngăn các quá trình khác không được thực hiện với bảng để thực thi DDL của nó.
  • Bởi vì nó (thường) không được ghi lại và không sử dụng các biến vị ngữ, nên a TRUNCATEsẽ nhanh hơn a DELETE, nhưng kém an toàn hơn.

BẢNG DROP - NGÔN NGỮ ĐỊNH NGHATA DỮ LIỆU (DDL)

DROP TABLEđi xa hơn một TRUNCATEtrong đó nó thực sự loại bỏ hoàn toàn bảng khỏi cơ sở dữ liệu. Điều này bao gồm loại bỏ tất cả các đối tượng liên quan, chẳng hạn như các chỉ mục và các ràng buộc. Nếu bạn đánh rơi một bảng, bạn không chỉ xóa tất cả dữ liệu mà còn cả cấu trúc. Điều này thường sẽ được thực hiện khi một bảng không còn cần thiết. Mối quan tâm chính là vì a DROPlà DDL, bạn thường không thể hoàn tác nó . Một số công cụ RDBMS sẽ cho phép bạn bọc DDL trong một giao dịch để bạn có thể khôi phục lại, nhưng điều này không được coi là thực tiễn tốt nhất và nên tránh.


1
Tôi sẽ thêm rằng TRUNCATE đặt lại bộ đếm tăng tự động của bảng.
DanMan

5

Mặc dù tôi không thể nói cho MySQL, đây là một bảng nhanh so sánh một số khía cạnh của việc cắt ngắn so với xóa trong Oracle.

truncate                             |   delete
---------------------------------    |   ---------------------------
DDL   (implicitly commits,           |   DML
    including any pending DML)       |  
Does not generate undo info          |   Generates undo info
    (rollback statements)            |       (rollback statements)
Resets high water mark in table      |   Does not affect full-scan 
    and all indexes, improving       |       performance
    full-scan performance            |      
Does not fire any delete triggers    |   Fires delete triggers
Priv to truncate cannot be granted   |   --
    to truncate another user's       |  
    table; DROP ANY TABLE system     |   
    priv required                    |      
Storage for table and indexes can    |   Never shrinks the size of a 
    be set to initial size           |       table or indexes
Cannot truncate parent table from    |   --
    an established referential       |  
    integrity constraint; must       |  
    first disable foreign key        |  
    that references the parent       |  
    table                            |  

Thông tin được tổng hợp từ cuốn sách này: http://amzn.com/0470395125

Hy vọng rằng điều này có thể giúp bất kỳ người dùng Oracle nào vấp ngã trên trang này, như tôi đã làm. Xin vui lòng chỉ ra rằng, nếu có, những điểm này đúng trong MySQL,


2

DROP TABLE TableName -> xóa bảng khỏi cơ sở dữ liệu.

TRUNCATE TABLE TableName-> xóa dữ liệu của bảng, vô điều kiện ... và đặt lại IDENTITYgiá trị hạt giống, nếu bảng có một IDENTITYtrường.


1
  • DELETE: Lệnh DML, nếu bạn thực hiện lệnh xóa, hãy xóa DATA duy nhất mà không hủy bảng Cấu trúc, chúng ta có thể ROLLBACK hàng dữ liệu theo cách hàng

  • TRUNCATE: Lệnh DDL, nếu bạn thực hiện lệnh Truncate, hãy xóa DATA duy nhất mà không hủy bảng Cấu trúc, chúng tôi không thể khôi phục dữ liệu cắt bỏ dữ liệu trong PAGE BY PAGE theo cách cắt nhanh hơn sau đó xóa truy vấn

  • DROP:, Lệnh DDL, nếu bạn thực hiện lệnh DROP, nó sẽ xóa (xóa) dữ liệu và tổng cấu trúc bảng, chúng tôi không thể khôi phục dữ liệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.