Sự khác biệt giữa TRUNCATE và DELETE trong SQL


303

Sự khác biệt giữa TRUNCATEDELETEtrong SQL là gì?

Nếu câu trả lời của bạn là nền tảng cụ thể, xin vui lòng chỉ ra rằng.


4
Tất cả các câu trả lời là cụ thể nền tảng. Không có lệnh TRUNCATE trong SQL tiêu chuẩn. Do đó, đây là một tính năng độc quyền và có nghĩa là một điều khác nhau đối với mỗi nhà cung cấp DBMS.
nvogel

Câu trả lời là rất cụ thể, vì nó phải như vậy, vì như sqlvogel đã chỉ ra, đây là một lệnh không chuẩn (TRUNCATE). Hoặc để lại 'orory' được gắn thẻ này hoặc biến nó thành câu trả lời theo kiểu cộng đồng và đưa ra hậu quả cho mỗi RDBMS chính (Oracle, MS-MSQL,
PostgreQuery

Nếu Giao dịch được thực hiện, có nghĩa là GIAO DỊCH, thì chúng tôi không thể khôi phục lệnh TRUNCATE, nhưng chúng tôi vẫn có thể khôi phục lệnh XÓA từ các tệp LOG, vì DELETE ghi lại chúng trong tệp Nhật ký trong trường hợp cần quay lại trong tương lai từ các tệp LOG.

Câu trả lời:


272

Đây là một danh sách các sự khác biệt. Tôi đã nhấn mạnh các tính năng dành riêng cho Oracle và hy vọng cộng đồng cũng có thể thêm vào sự khác biệt cụ thể của các nhà cung cấp khác. Sự khác biệt phổ biến đối với hầu hết các nhà cung cấp có thể đi ngay bên dưới các tiêu đề, với sự khác biệt được tô sáng bên dưới.


Tổng quan chung

Nếu bạn muốn xóa nhanh tất cả các hàng khỏi một bảng và bạn thực sự chắc chắn rằng bạn muốn làm điều đó và bạn không có khóa ngoại đối với các bảng, thì TRUNCATE có thể sẽ nhanh hơn XÓA .

Các vấn đề cụ thể của hệ thống phải được xem xét, như chi tiết dưới đây.


Loại báo cáo

Xóa là DML, Cắt ngắn là DDL ( DDL và DML là gì? )


Cam kết và Phục hồi

Biến theo nhà cung cấp

Máy chủ SQL *

Cắt ngắn có thể được cuộn lại.

PostgreSQL

Cắt ngắn có thể được cuộn lại.

Oracle

Bởi vì TRUNCATE là DDL, nó bao gồm hai lần xác nhận, một trước và sau khi thực hiện câu lệnh. Do đó, cắt ngắn không thể được khôi phục và một thất bại trong quá trình cắt ngắn sẽ đưa ra một cam kết nào.

Tuy nhiên, xem Flashback bên dưới.


Khai hoang không gian

Xóa không phục hồi không gian, Truncate phục hồi không gian

Oracle

Nếu bạn sử dụng mệnh đề REUSE STORAGE thì các phân đoạn dữ liệu không được phân bổ, có thể hiệu quả hơn một chút nếu bảng được tải lại với dữ liệu. Dấu nước cao được đặt lại.


Phạm vi hàng

Xóa có thể được sử dụng để xóa tất cả các hàng hoặc chỉ một tập hợp con của các hàng. Cắt bỏ tất cả các hàng.

Oracle

Khi một bảng được phân vùng, các phân vùng riêng lẻ có thể bị cắt cụ thể, do đó có thể loại bỏ một phần tất cả dữ liệu của bảng.


Các loại đối tượng

Xóa có thể được áp dụng cho các bảng và bảng trong một cụm. Cắt ngắn chỉ áp dụng cho các bảng hoặc toàn bộ cụm. (Có thể là cụ thể của Oracle)


Nhận dạng đối tượng dữ liệu

Oracle

Xóa không ảnh hưởng đến id đối tượng dữ liệu, nhưng việc cắt xén chỉ định id đối tượng dữ liệu mới trừ khi chưa bao giờ có thao tác chèn vào bảng kể từ khi tạo. Ngay cả một lần chèn được cuộn lại sẽ khiến id đối tượng dữ liệu mới được gán khi cắt .


Flashback (Oracle)

Flashback hoạt động trên các xóa, nhưng cắt ngắn ngăn chặn hồi tưởng về trạng thái trước khi hoạt động.

Tuy nhiên, từ 11gR2, tính năng FLASHBACK ARCHIVE cho phép điều này, ngoại trừ trong Phiên bản Express

Sử dụng FLASHBACK trong Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htmlm#ADFNS638


Đặc quyền

Biến đổi

Oracle

Xóa có thể được cấp trên một bảng cho người dùng hoặc vai trò khác, nhưng không thể cắt bớt mà không sử dụng khoản trợ cấp DROP ANY TABLE.


Làm lại hoàn tác

Xóa tạo ra một lượng nhỏ làm lại và một lượng lớn hoàn tác. Cắt ngắn tạo ra một lượng không đáng kể của mỗi.


Chỉ mục

Oracle

Một hoạt động cắt ngắn làm cho các chỉ mục không thể sử dụng lại có thể sử dụng lại. Xóa không.


Khóa ngoại

Không thể áp dụng cắt ngắn khi khóa ngoại được kích hoạt tham chiếu bảng. Điều trị với xóa phụ thuộc vào cấu hình của khóa ngoại.


Khóa bàn

Oracle

Cắt ngắn yêu cầu khóa bảng độc quyền, xóa yêu cầu khóa bảng chung. Do đó, vô hiệu hóa khóa bảng là một cách để ngăn chặn các hoạt động cắt ngắn trên bảng.


Gây nên

Các trình kích hoạt DML không kích hoạt tính năng cắt ngắn.

Oracle

Kích hoạt DDL có sẵn.


Thực thi từ xa

Oracle

Cắt ngắn không thể được ban hành qua một liên kết cơ sở dữ liệu.


Cột định danh

Máy chủ SQL *

Cắt ngắn đặt lại chuỗi cho các loại cột IDENTITY, xóa không.


Tập kết quả

Trong hầu hết các triển khai, một DELETEcâu lệnh có thể trả về máy khách các hàng đã bị xóa.

ví dụ: trong chương trình con Oracle PL / SQL, bạn có thể:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

Không hiểu câu lệnh thứ 4 của bạn: nếu tôi nói XÓA [ ] TỪ Bảng; sau đó * tất cả các hàng trong bảng đó sẽ bị xóa trừ khi FK dừng nó. Nhân tiện, tôi đoán đây là SQL Server dành riêng, bạn không thể sử dụng TRUNCATE trên các bảng có FK.
Joe Pineda

Một số ý kiến ​​khác: Tôi không đồng ý với tuyên bố thứ 3 của bạn, trừ khi đó là đặc thù của Oracle. Ít nhất là với SQL S., nếu bạn XÓA hoặc TRUNCATE, bạn không phục hồi dung lượng (tức là các tệp cơ sở dữ liệu không thu nhỏ trên ổ cứng) trừ khi bạn yêu cầu cụ thể.
Joe Pineda

1
Tuyên bố 5TH: bạn có thể quay lại BẢNG TRUNCATE trên sql 2008 r2
Eric Labashosky

1
Postgresql có thể phục hồi TRUNCATE và do đó cũng không tự động điều khiển nó.
rfusca

5
XÓA trả về số lượng hàng đã xóa, nhưng TRUNCATE thì không. Đó là điểm rất ngớ ngẩn nhưng đáng nói đến nó :)
Deepak Kumar Jha

191

Sự khác biệt giữa cắt ngắn và xóa được liệt kê dưới đây:

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+

Cắt bỏ danh tính thiết lập lại của bảng Nó có nghĩa là gì? Nhưng, còn Xóa thì sao?
Ravi

1
@jWeaver: Có nghĩa là khi bạn đặt thuộc tính Thông số nhận dạng thành True cho trường khóa chính, vì vậy khi bạn chèn dữ liệu vào bảng đó, cột khóa chính giữ giá trị như 1,2,3,4,5 .... (nếu Danh tính bắt đầu từ 1 và hạt giống là 1) và khi bạn cắt bớt bảng, nó sẽ mất tất cả giá trị nhận dạng, vì vậy khi bạn bắt đầu chèn dữ liệu vào bảng đó một lần nữa, nó sẽ bắt đầu từ 1 thay vì nơi còn lại cuối cùng. Trong DELETE, nó ngược lại, nó giữ nguyên giá trị nhận dạng ngay cả sau khi bạn thực hiện câu lệnh DELETE. Xin lỗi vì sai lầm điểm so sánh thứ 2 trong cột XÓA trong hình trên.
Bhaumik Patel

Có vẻ như bạn đang trả lời cho SQL SERVER
Ravi

4
Cả TRUNCATE và DELETE đều có thể được khôi phục trong SQL SERVER . Và trong hàng thứ 2 liều XÓA không được thiết lập lại danh tính. Bây giờ làm thế nào bạn có thể chỉnh sửa bài này? Đó là điều tồi tệ khi sử dụng hình ảnh trong StackOverflow.
Mahmood Jenami

2
Cắt ngắn đang được cuộn lại! (SQL SERVER)
Aimal Khan

55

RƠI VÃI

Lệnh DROP xóa một bảng khỏi cơ sở dữ liệu. Tất cả các hàng, chỉ mục và đặc quyền của bảng cũng sẽ bị xóa. Không có kích hoạt DML sẽ bị sa thải. Các hoạt động không thể được khôi phục.

TRUNCATE

TRUNCATE xóa tất cả các hàng khỏi bảng. Các hoạt động không thể được khôi phục và không có kích hoạt sẽ được kích hoạt. Như vậy, TRUNCATE nhanh hơn và không sử dụng nhiều khoảng trống như XÓA. Khóa cấp độ bảng sẽ được thêm khi Cắt.

XÓA BỎ

Lệnh DELETE được sử dụng để xóa các hàng khỏi bảng. Mệnh đề WHERE có thể được sử dụng để chỉ xóa một số hàng. Nếu không có điều kiện WHERE được chỉ định, tất cả các hàng sẽ bị xóa. Sau khi thực hiện thao tác XÓA, bạn cần CAM KẾT hoặc ROLLBACK giao dịch để thực hiện thay đổi vĩnh viễn hoặc hoàn tác nó. Lưu ý rằng thao tác này sẽ khiến tất cả các kích hoạt XÓA trên bàn phát ra. Khóa cấp hàng sẽ được thêm vào khi xóa.

Từ: http://www.orafaq.com/faq/difference_b between_truncate_delete_and_drop_commands


5
Lời giải thích hay cho người mới bắt đầu như tôi
Vikas Kukreti

Ngắn và ngọt ngào
ABH

23

Tất cả các câu trả lời hay, mà tôi phải thêm:

TRUNCATE TABLElà DDL ( Ngôn ngữ xác định dữ liệu ), không phải là lệnh DML ( Dữ liệu thao tác dữ liệu ), Delete Triggersnên không chạy.


Ah, kích hoạt ... đó là một điểm tốt. Tôi sẽ thêm nó vào danh sách tôi đã lập và ghi có cho bạn Polara, nếu điều đó ổn.
David Aldridge

SQL Server sẽ không cho phép bạn cắt bớt một bảng có khóa ngoại, vì vậy điểm xếp tầng của bạn có thể được điều chỉnh, tùy thuộc vào nền tảng.
Meff

PostgreSQL có "Trình kích hoạt TRUNCATE"
a_horse_with_no_name


17

Với SQL Server hoặc MySQL, nếu có PK với mức tăng tự động, cắt ngắn sẽ đặt lại bộ đếm.


Để làm rõ, đây là cho SQL Server nếu bảng có một cột được xác định là IDENTITY. Xóa sẽ duy trì ID được gán tự động cuối cùng, trong khi Truncate đặt lại bộ đếm.
Codewerks

Vì câu hỏi được gắn thẻ ORACLE, nên câu trả lời này là SAI, do đó bị bỏ qua.
Guy

Rất tiếc, đã không nhìn thấy thẻ orory :)
mathieu

+1 đúng và đặt lại về 0 . Nếu bạn muốn nó là 1 thay vào đó:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

Tôi đã thêm câu trả lời này vào câu trả lời của cộng đồng và làm cho nó thân thiện hơn một chút để ghi lại các vấn đề cụ thể của nhà cung cấp
David Aldridge

12

"Cắt ngắn không đăng nhập bất cứ điều gì" là chính xác. Tôi sẽ đi xa hơn:

Cắt ngắn không được thực hiện trong bối cảnh của một giao dịch.

Lợi thế về tốc độ của việc cắt ngắn hơn là xóa. Lợi thế đó dao động từ tầm thường đến to lớn, tùy thuộc vào tình huống của bạn.

Tuy nhiên, tôi đã thấy cắt ngắn vô tình phá vỡ tính toàn vẹn tham chiếu và vi phạm các ràng buộc khác. Sức mạnh mà bạn có được bằng cách sửa đổi dữ liệu bên ngoài một giao dịch phải được cân bằng với trách nhiệm mà bạn thừa hưởng khi bạn đi bộ chặt chẽ mà không cần mạng.


7

TRUNCATElà câu lệnh DDL trong khi đó DELETElà câu lệnh DML. Dưới đây là sự khác biệt giữa hai:

  1. Như TRUNCATEmột tuyên bố DDL ( Ngôn ngữ định nghĩa dữ liệu ), nó không yêu cầu một cam kết để thực hiện các thay đổi vĩnh viễn. Và đây là lý do tại sao các hàng bị xóa bởi cắt ngắn không thể được khôi phục. Mặt khác, DELETEmột câu lệnh DML ( Ngôn ngữ thao tác dữ liệu ) do đó yêu cầu cam kết rõ ràng để làm cho hiệu ứng của nó vĩnh viễn.

  2. TRUNCATEluôn loại bỏ tất cả các hàng khỏi một bảng, để trống bảng và cấu trúc bảng nguyên vẹn trong khi DELETEcó thể loại bỏ một cách có điều kiện nếu mệnh đề where được sử dụng.

  3. Các hàng bị xóa bởi TRUNCATE TABLEcâu lệnh không thể được khôi phục và bạn không thể chỉ định mệnh đề where trong TRUNCATEcâu lệnh.

  4. TRUNCATEcâu lệnh không kích hoạt kích hoạt thay vì kích hoạt xóa DELETEcâu lệnh

Đây là liên kết rất tốt liên quan đến chủ đề.


6

Có, XÓA chậm hơn, TRUNCATE nhanh hơn. Tại sao?

XÓA phải đọc các bản ghi, kiểm tra các ràng buộc, cập nhật khối, cập nhật chỉ mục và tạo lại / hoàn tác. Tất cả điều đó cần có thời gian.

TRUNCATE chỉ cần điều chỉnh một con trỏ trong cơ sở dữ liệu cho bảng (Dấu nước cao) và gặp sự cố! dữ liệu đã biến mất

Đây là đặc thù của Oracle, AFAIK.


PostgreSQL cũng tương tự như vậy.
Gavin M. Roy

6

TRUNCATE

Truy vấn SQL TRUNCATE loại bỏ tất cả các hàng khỏi một bảng, mà không ghi nhật ký xóa hàng riêng lẻ.

  • TRUNCATE là một lệnh DDL.
  • TRUNCATE được thực thi bằng cách sử dụng khóa bảng và toàn bộ bảng bị khóa để xóa tất cả các bản ghi.
  • Chúng tôi không thể sử dụng mệnh đề WHERE với TRUNCATE.
  • TRUNCATE xóa tất cả các hàng khỏi bảng.
  • Đăng nhập tối thiểu trong nhật ký giao dịch, vì vậy nó là hiệu suất nhanh hơn khôn ngoan.
  • TRUNCATE TABLE xóa dữ liệu bằng cách sắp xếp lại các trang dữ liệu được sử dụng để lưu trữ dữ liệu bảng và chỉ ghi lại các giao dịch trang trong nhật ký giao dịch.
  • Để sử dụng Truncate trên bàn, bạn cần ít nhất ALTER quyền trên bảng.
  • Truncate sử dụng ít không gian giao dịch hơn câu lệnh Xóa.
  • Cắt ngắn không thể được sử dụng với các khung nhìn được lập chỉ mục.
  • TRUNCATE nhanh hơn XÓA.

XÓA BỎ

Để thực hiện hàng đợi XÓA, cần có quyền xóa trên bảng đích. Nếu bạn cần sử dụng mệnh đề WHERE trong XÓA, cũng cần có quyền chọn.

  • XÓA là một lệnh DML.
  • XÓA được thực hiện bằng cách sử dụng khóa hàng, mỗi hàng trong bảng bị khóa để xóa.
  • Chúng ta có thể sử dụng mệnh đề where với DELETE để lọc và xóa các bản ghi cụ thể.
  • Lệnh DELETE được sử dụng để xóa các hàng khỏi bảng dựa trên điều kiện WHERE.
  • Nó duy trì nhật ký, vì vậy nó chậm hơn TRUNCATE.
  • Câu lệnh DELETE xóa từng hàng một và ghi lại một mục trong nhật ký giao dịch cho mỗi hàng bị xóa.
  • Danh tính của cột giữ XÓA giữ lại danh tính.
  • Để sử dụng Xóa, bạn cần có quyền XÓA trên bảng.
  • Xóa sử dụng nhiều không gian giao dịch hơn câu lệnh Truncate.
  • Xóa có thể được sử dụng với các khung nhìn được lập chỉ mục.

5

Nếu vô tình, bạn đã xóa tất cả dữ liệu khỏi bảng bằng Xóa / Cắt bớt. Bạn có thể phục hồi giao dịch cam kết. Khôi phục bản sao lưu cuối cùng và chạy nhật ký giao dịch cho đến thời điểm Xóa / Rút ngắn sắp xảy ra.

Các thông tin liên quan dưới đây là từ một bài đăng trên blog :

Trong khi làm việc trên cơ sở dữ liệu, chúng tôi đang sử dụng Xóa và Cắt bớt mà không biết sự khác biệt giữa chúng. Trong bài viết này, chúng tôi sẽ thảo luận về sự khác biệt giữa Xóa và Cắt bớt trong Sql.

Xóa bỏ:

  • Xóa là một lệnh DML.
  • Xóa câu lệnh được thực thi bằng cách sử dụng khóa hàng, mỗi hàng trong bảng bị khóa để xóa.
  • Chúng ta có thể chỉ định các bộ lọc trong mệnh đề where.
  • Nó xóa dữ liệu được chỉ định nếu có điều kiện.
  • Xóa các hoạt động một kích hoạt bởi vì các hoạt động được ghi lại cá nhân.
  • Chậm hơn Truncate vì nó giữ nhật ký

Cắt ngắn

  • Cắt ngắn là một lệnh DDL.
  • Bảng rút gọn luôn khóa bảng và trang nhưng không phải mỗi hàng. Nó sẽ xóa tất cả dữ liệu.
  • Không thể sử dụng điều kiện.
  • Nó loại bỏ tất cả các dữ liệu.
  • Bảng cắt bớt không thể kích hoạt một kích hoạt vì hoạt động không ghi nhật ký xóa hàng riêng lẻ.
  • Hiệu suất nhanh hơn, vì nó không giữ bất kỳ nhật ký nào.

Lưu ý: Xóa và cắt bỏ cả hai có thể được khôi phục khi sử dụng với Giao dịch. Nếu Giao dịch được thực hiện, có nghĩa là đã cam kết thì chúng tôi không thể khôi phục lệnh Truncate, nhưng chúng tôi vẫn có thể khôi phục lệnh Xóa khỏi các tệp Nhật ký, vì xóa ghi lại chúng trong tệp Nhật ký trong trường hợp cần quay lại trong tương lai từ các tệp nhật ký.

Nếu bạn có một ràng buộc khóa ngoại tham chiếu đến bảng mà bạn đang cố gắng cắt bớt, thì điều này sẽ không hoạt động ngay cả khi bảng giới thiệu không có dữ liệu trong đó. Điều này là do việc kiểm tra khóa ngoại được thực hiện với DDL chứ không phải DML. Điều này có thể được khắc phục bằng cách tạm thời vô hiệu hóa (các) ràng buộc khóa ngoại đối với bảng.

Xóa bảng là một hoạt động đăng nhập. Vì vậy, việc xóa từng hàng được ghi vào nhật ký giao dịch, làm cho nó chậm. Bảng rút gọn cũng xóa tất cả các hàng trong một bảng, nhưng nó sẽ không ghi nhật ký xóa từng hàng thay vào đó nó ghi nhật ký phân chia các trang dữ liệu của bảng, làm cho nó nhanh hơn.

~ Nếu vô tình bạn đã xóa tất cả dữ liệu khỏi bảng bằng Xóa / Cắt bớt. Bạn có thể phục hồi giao dịch cam kết. Khôi phục bản sao lưu cuối cùng và chạy nhật ký giao dịch cho đến thời điểm Xóa / Rút ngắn sắp xảy ra.


1
Cảm ơn @Lucas: anh ấy đã nội dung. Tôi chỉ đặt nó trong một blockquote để làm rõ rằng nó là từ một nguồn khác biệt.
AstroCB

4

Trong SQL Server 2005 tôi tin rằng bạn có thể khôi phục một phần rút gọn


4

XÓA BỎ

Lệnh DELETE được sử dụng để xóa các hàng khỏi bảng. Mệnh đề WHERE có thể được sử dụng để chỉ xóa một số hàng. Nếu không có điều kiện WHERE được chỉ định, tất cả các hàng sẽ bị xóa. Sau khi thực hiện thao tác XÓA, bạn cần CAM KẾT hoặc ROLLBACK giao dịch để thực hiện thay đổi vĩnh viễn hoặc hoàn tác nó. Lưu ý rằng thao tác này sẽ khiến tất cả các kích hoạt XÓA trên bàn phát ra.

TRUNCATE

TRUNCATE xóa tất cả các hàng khỏi bảng. Các hoạt động không thể được khôi phục và không có kích hoạt sẽ được kích hoạt. Như vậy, TRUCATE nhanh hơn và không sử dụng nhiều không gian như XÓA.

RƠI VÃI

Lệnh DROP xóa một bảng khỏi cơ sở dữ liệu. Tất cả các hàng, chỉ mục và đặc quyền của bảng cũng sẽ bị xóa. Không có kích hoạt DML sẽ bị sa thải. Các hoạt động không thể được khôi phục.


DROP và TRUNCATE là các lệnh DDL, trong khi DELETE là lệnh DML. Do đó, các hoạt động XÓA có thể được khôi phục (hoàn tác), trong khi các hoạt động DROP và TRUNCATE không thể được khôi phục.

Từ: http://www.orafaq.com/faq/difference_b between_truncate_delete_and_drop_commands


Điều này có thêm một cái gì đó cho các câu trả lời hiện tại?
David Aldridge

3

TRUNCATE có thể được khôi phục nếu được gói trong một giao dịch.

Vui lòng xem hai tài liệu tham khảo dưới đây và tự kiểm tra: -

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-USE-log-files-after-transaction-session-is-closes/

http://sqlblog.com/bloss/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE so với DELETE là một trong những câu hỏi nổi tiếng trong các cuộc phỏng vấn SQL. Chỉ cần chắc chắn rằng bạn giải thích nó đúng với Người phỏng vấn hoặc nó có thể khiến bạn mất việc. Vấn đề là không có nhiều người biết nên rất có thể họ sẽ coi câu trả lời là sai nếu bạn nói với họ rằng CÓ CÓ THỂ rút ngắn lại.


2

Một sửa chữa nhỏ cho câu trả lời ban đầu - xóa cũng tạo ra số lượng đáng kể làm lại (vì bản thân hoàn tác được bảo vệ bởi làm lại). Điều này có thể được nhìn thấy từ đầu ra tự động:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed

chủ đề cũ của nó nhưng theo sự hiểu biết của tôi cắt ngắn chỉ tạo ra một lượng tốt bản ghi làm lại trong khi xóa sẽ tạo ra hoàn tác và làm lại cả hai.
Saurabh Sinha

2

Dưới đây là câu trả lời chi tiết của tôi về sự khác biệt giữa XÓA và TRUNCATE trong SQL Server

Xóa dữ liệu : Điều đầu tiên trước tiên, cả hai có thể được sử dụng để xóa các hàng khỏi bảng.
Nhưng một XÓA có thể được sử dụng để xóa các hàng không chỉ khỏi Bảng mà còn từ XEM hoặc kết quả của một chủ đề OPENWAYSET hoặc OPENQUERY theo khả năng của nhà cung cấp.

TỪ Mệnh đề : Với XÓA, bạn cũng có thể xóa các hàng từ một bảng / view / rowset_feft_lrict dựa trên các hàng từ một bảng khác bằng cách sử dụng mệnh đề TỪ khác. Trong mệnh đề TỪ đó bạn cũng có thể viết các điều kiện THAM GIA bình thường. Trên thực tế, bạn có thể tạo một câu lệnh XÓA từ một câu lệnh CHỌN không chứa bất kỳ hàm tổng hợp nào bằng cách thay thế CHỌN bằng XÓA và xóa tên cột.
Với TRUNCATE bạn không thể làm điều đó.

WHERE : TRUNCATE không thể có Điều kiện WHERE, nhưng có thể XÓA. Điều đó có nghĩa là với TRUNCATE, bạn không thể xóa một hàng cụ thể hoặc một nhóm hàng cụ thể. TRUNCATE TABLE tương tự như câu lệnh DELETE không có mệnh đề WHERE.

Hiệu suất : TRUNCATE TABLE nhanh hơn và sử dụng ít tài nguyên nhật ký giao dịch và hệ thống hơn. Và một trong những lý do là các khóa được sử dụng bởi một trong hai câu lệnh. Câu lệnh DELETE được thực thi bằng cách sử dụng khóa hàng, mỗi hàng trong bảng bị khóa để xóa. BẢNG TRUNCATE luôn khóa bảng và trang nhưng không khóa từng hàng.

Nhật ký giao dịch : Câu lệnh DELETE xóa từng hàng một và tạo các mục riêng lẻ trong nhật ký giao dịch cho mỗi hàng.
TRUNCATE TABLE xóa dữ liệu bằng cách sắp xếp lại các trang dữ liệu được sử dụng để lưu trữ dữ liệu bảng và chỉ ghi lại các giao dịch trang trong nhật ký giao dịch.

Trang : Sau khi câu lệnh XÓA được thực thi, bảng vẫn có thể chứa các trang trống. TRUNCATE xóa dữ liệu bằng cách sắp xếp lại các trang dữ liệu được sử dụng để lưu trữ dữ liệu bảng.

Kích hoạt : TRUNCATE không kích hoạt các kích hoạt xóa trên bảng. Vì vậy, bạn phải rất cẩn thận trong khi sử dụng TRUNCATE. Không bao giờ nên sử dụng TRUNCATE nếu xóa Kích hoạt được xác định trên bảng để thực hiện một số thao tác dọn dẹp hoặc ghi nhật ký tự động khi các hàng bị xóa.

Cột định danh : Với TRUNCATE nếu bảng chứa cột nhận dạng, bộ đếm cho cột đó được đặt lại về giá trị hạt giống được xác định cho cột. Nếu không có hạt giống nào được xác định, giá trị mặc định 1 được sử dụng. XÓA không thiết lập lại bộ đếm danh tính. Vì vậy, nếu bạn muốn giữ lại bộ đếm danh tính, thay vào đó hãy sử dụng XÓA.

Sao chép : XÓA có thể được sử dụng đối với bảng được sử dụng trong sao chép giao dịch hoặc sao chép hợp nhất.
Trong khi TRUNCATE không thể được sử dụng đối với các bảng liên quan đến sao chép giao dịch hoặc sao chép hợp nhất.

Phục hồi : Câu lệnh XÓA có thể được khôi phục.
TRUNCATE cũng có thể được khôi phục miễn là nó được đặt trong một khối GIAO DỊCH và phiên không được đóng lại. Khi phiên kết thúc, bạn sẽ không thể khôi phục TRUNCATE.

Hạn chế : Câu lệnh XÓA có thể thất bại nếu nó vi phạm trình kích hoạt hoặc cố gắng xóa một hàng được tham chiếu bởi dữ liệu trong một bảng khác với ràng buộc FOREIGN KEY. Nếu DELETE xóa nhiều hàng và bất kỳ một trong các hàng bị xóa nào vi phạm kích hoạt hoặc ràng buộc, câu lệnh sẽ bị hủy, lỗi được trả về và không có hàng nào bị xóa.
Và nếu XÓA được sử dụng đối với Chế độ xem, Chế độ xem đó phải là chế độ xem Cập nhật. TRUNCATE không thể được sử dụng đối với bảng được sử dụng trong chế độ xem Được lập chỉ mục.
TRUNCATE không thể được sử dụng đối với bảng được tham chiếu bởi ràng buộc FOREIGN KEY, trừ khi bảng có khóa ngoại tham chiếu chính nó.


Xin chào Mangal - cảm ơn câu trả lời, đặc biệt về các vấn đề cụ thể của SQL * Server. Bạn có nghĩ rằng bạn có thể tích hợp những điểm đó với câu trả lời của Wiki cộng đồng đã được chấp nhận không?
David Aldridge

Có chắc chắn, nhưng làm thế nào và ở đâu? Xin lỗi tôi mới ở đây.
Mangal Pardeshi

"Vì vậy, nếu bạn muốn giữ lại bộ đếm nhận dạng, hãy sử dụng XÓA" bạn có thể sử dụngDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag

1

Sự khác biệt lớn nhất là cắt ngắn là hoạt động không đăng nhập trong khi xóa là.

Đơn giản, điều đó có nghĩa là trong trường hợp xảy ra sự cố cơ sở dữ liệu, bạn không thể khôi phục dữ liệu được vận hành bằng cách cắt bớt nhưng với việc xóa bạn có thể.

Thêm chi tiết tại đây


1

Câu lệnh XÓA: Lệnh này chỉ xóa các hàng khỏi bảng dựa trên điều kiện được đưa ra trong mệnh đề where hoặc xóa tất cả các hàng khỏi bảng nếu không có điều kiện nào được chỉ định. Nhưng nó không giải phóng không gian chứa bảng.

Cú pháp của câu lệnh SQL XÓA là:

XÓA TỪ tên_bảng [điều kiện WHERE];

Câu lệnh TRUNCATE: Lệnh này được sử dụng để xóa tất cả các hàng khỏi bảng và giải phóng không gian chứa bảng.


1

XÓA BỎ

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax  Delete from [Table] where [Condition]

TRUNCATE

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax  Truncate table [Table]

Để biết thêm chi tiết truy cập

http://www.zilckh.com/what-is-the-difference-b between-trate-and-dete /


1

Một điểm khác biệt nữa của hai thao tác là nếu bảng chứa cột nhận dạng, bộ đếm cho cột đó được đặt lại 1 (hoặc giá trị hạt giống được xác định cho cột) trong TRUNCATE. XÓA không có ảnh hưởng này.


0

Nói tóm lại, cắt ngắn không ghi nhật ký bất cứ điều gì (vì vậy nhanh hơn nhiều nhưng không thể hoàn tác) trong khi xóa được ghi lại (và có thể là một phần của giao dịch lớn hơn, sẽ phục hồi, v.v.). Nếu bạn có dữ liệu mà bạn không muốn trong một bảng trong dev, thông thường tốt hơn là cắt bớt vì bạn không có nguy cơ điền vào nhật ký giao dịch


0

Một lý do lớn rất tiện lợi là khi bạn cần làm mới dữ liệu trong một bảng hàng triệu, nhưng không muốn xây dựng lại nó. "Xóa *" sẽ mất mãi mãi, trong khi tác động của nước hoa của Truncate sẽ không đáng kể.


0

Không thể làm DDL qua một dblink.


0

Tôi muốn bình luận về bài đăng của matthieu, nhưng tôi chưa có đại diện ...

Trong MySQL, bộ đếm tăng tự động được đặt lại với cắt ngắn, nhưng không xóa.


0

Nó không phải là cắt ngắn không đăng nhập bất cứ điều gì trong SQL Server. cắt ngắn không ghi nhật ký bất kỳ thông tin nào nhưng nó ghi nhật ký phân bổ trang dữ liệu cho bảng mà bạn đã bắn TRUNCATE.

và bản ghi bị cắt bớt có thể được khôi phục nếu chúng ta xác định giao dịch lúc đầu và chúng ta có thể khôi phục bản ghi bị cắt sau khi khôi phục nó. Nhưng không thể phục hồi các bản ghi bị cắt từ bản sao lưu nhật ký giao dịch sau khi giao dịch bị cắt ngắn đã cam kết.


0

Cắt ngắn cũng có thể được khôi phục ở đây exapmle

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

Cắt ngắn và Xóa trong SQL là hai lệnh được sử dụng để xóa hoặc xóa dữ liệu khỏi bảng. Mặc dù về cơ bản khá cơ bản, cả hai lệnh Sql có thể tạo ra nhiều rắc rối cho đến khi bạn làm quen với các chi tiết trước khi sử dụng nó. Một lựa chọn lệnh không chính xác có thể dẫn đến quá trình rất chậm hoặc thậm chí có thể làm hỏng phân đoạn nhật ký, nếu cần loại bỏ quá nhiều dữ liệu và phân đoạn nhật ký là không đủ. Đó là lý do tại sao cần biết khi nào nên sử dụng lệnh cắt và xóa trong SQL nhưng trước khi sử dụng lệnh này, bạn nên biết về Sự khác biệt giữa Cắt ngắn và Xóa, và dựa vào chúng, chúng ta có thể tìm ra khi nào DELETE là tùy chọn tốt hơn để xóa dữ liệu hoặc TRUNCATE nên được sử dụng để thanh lọc các bảng.

Tham khảo kiểm tra bấm vào đây


0

Bằng cách phát hành câu lệnh TRUNCATE TABLE, bạn đang hướng dẫn SQL Server xóa mọi bản ghi trong một bảng, mà không có bất kỳ quá trình ghi nhật ký hoặc xử lý giao dịch nào diễn ra.


0

Câu lệnh DELETE có thể có mệnh đề WHERE để xóa các bản ghi cụ thể trong khi câu lệnh TRUNCATE không yêu cầu bất kỳ và xóa toàn bộ bảng. Điều quan trọng, câu lệnh DELETE ghi lại ngày bị xóa trong khi câu lệnh TRUNCATE thì không.


0

Thêm một sự khác biệt cụ thể đối với máy chủ microsoft sql là deletebạn có thể sử dụng outputcâu lệnh để theo dõi những bản ghi nào đã bị xóa, ví dụ:

delete from [SomeTable]
output deleted.Id, deleted.Name

Bạn không thể làm điều này với truncate.

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.