BẢNG TRUNCATE (Transact-SQL)

Bạn đang xem: cắt ngắn bảng trong đó sql

BẢNG TRUNCATE (Transact-SQL)

Trong bài viết này

Áp dụng cho: SQL Server (tất cả các phiên bản được hỗ trợ) Cơ sở dữ liệu Azure SQL Azure SQL Managed Instance Azure Synapse Analytics Hệ thống phân tích nền tảng (PDW)

Xóa tất cả các hàng khỏi bảng hoặc các phân vùng được chỉ định của bảng mà không ghi nhật ký các lần xóa hàng riêng lẻ. TRUNCATE TABLE tương tự như câu lệnh DELETE không có mệnh đề WHERE; tuy nhiên, TRUNCATE TABLE nhanh hơn và sử dụng ít tài nguyên hệ thống và nhật ký giao dịch hơn.

Quy ước về cú pháp Transact-SQL

Cú pháp

  - Cú pháp cho SQL Server và Azure SQL Database
  
BẢNG TRUNCATE
    {database_name.schema_name.table_name | schema_name.table_name | table_name}
    [WITH (PARTITIONS ({& lt; partition_number_expression & gt; | & lt; range & gt;}
    [ , ...N ] ) ) ]
[; ]
  
& lt; phạm vi & gt; :: =
& lt; phân_lục_số_lượng & gt; ĐẾN & lt; phân vùng_số_thể_thể & gt;
 
  - Cú pháp cho Azure Synapse Analytics và Kho dữ liệu song song
  
BẢNG TRUNCATE {database_name.schema_name.table_name | schema_name.table_name | table_name}
[;]
 

Lưu ý

Để xem cú pháp Transact-SQL cho SQL Server 2014 trở về trước, hãy xem Tài liệu về các phiên bản trước .

Đối số

database_name

Là tên của cơ sở dữ liệu.

schema_name

Là tên của lược đồ chứa bảng.

table_name

Là tên của bảng cần cắt bớt hoặc từ đó tất cả các hàng bị xóa. table_name phải là một ký tự. table_name không được là hàm OBJECT_ID () hoặc một biến.

WITH (PARTITIONS ({& lt; partition_number_expression & gt; | & lt; range & gt;} [, … n]))

Áp dụng cho : SQL Server (SQL Server 2016 (13.x) đến phiên bản hiện tại )

Chỉ định các phân vùng để cắt bớt hoặc từ đó tất cả các hàng bị loại bỏ. Nếu bảng không được phân vùng, đối số WITH PARTITIONS sẽ tạo ra lỗi. Nếu mệnh đề WITH PARTITIONS không được cung cấp, toàn bộ bảng sẽ bị cắt bớt.

& lt; phân_lục_số_lượng & gt; có thể được chỉ định theo những cách sau:

  • Cung cấp số lượng của một phân vùng, ví dụ: WITH (PARTITIONS (2))

  • Cung cấp số phân vùng cho một số phân vùng riêng lẻ được phân tách bằng dấu phẩy, ví dụ: WITH (PARTITIONS (1, 5))

  • Cung cấp cả phạm vi và phân vùng riêng lẻ, ví dụ: WITH (PARTITIONS (2, 4, 6 TO 8))

  • & lt; phạm vi & gt; có thể được chỉ định dưới dạng số phân vùng được phân tách bằng từ TO , ví dụ: WITH (PARTITIONS (6 ĐẾN 8))

Để cắt bớt một bảng được phân vùng, bảng và các chỉ mục phải được căn chỉnh (được phân vùng trên cùng một chức năng phân vùng).

Nhận xét

So với câu lệnh DELETE, TRUNCATE TABLE có những ưu điểm sau:

  • Sử dụng ít không gian nhật ký giao dịch hơn.

    Câu lệnh DELETE xóa từng hàng một và ghi lại một mục nhập trong nhật ký giao dịch cho mỗi hàng đã xóa. TRUNCATE TABLE xóa dữ liệu bằng cách phân bổ 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 phân bổ trang trong nhật ký giao dịch.

  • Thường sử dụng ít ổ khóa hơn.

    Khi 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 sẽ bị khóa để xóa. TRUNCATE TABLE luôn khóa bảng (bao gồm khóa giản đồ (SCH-M)) và trang nhưng không khóa từng hàng.

  • Không có ngoại lệ, không có trang nào được để lại trong bảng.

    Sau khi câu lệnh DELETE được thực thi, bảng vẫn có thể chứa các trang trống. Ví dụ: không thể phân bổ các trang trống trong heap mà không có ít nhất một khóa bảng (LCK_M_X) độc quyền. Nếu thao tác xóa không sử dụng khóa bảng, bảng (heap) sẽ chứa nhiều trang trống. Đối với các chỉ mục, thao tác xóa có thể để lại các trang trống, mặc dù các trang này sẽ được xử lý nhanh chóng bằng quy trình dọn dẹp nền.

Xem Thêm  SQL GIỮA (7 Ví dụ với Ngày, Số trong MS SQL Server và MySQL) - sql cho giữa hai ngày

TRUNCATE TABLE xóa tất cả các hàng khỏi bảng, nhưng cấu trúc bảng và các cột, ràng buộc, chỉ mục, v.v. của nó vẫn còn. Để xóa định nghĩa bảng ngoài dữ liệu của nó, hãy sử dụng câu lệnh DROP TABLE .

Nếu bảng chứa cột nhận dạng, bộ đếm cho cột đó được đặt lại thành giá trị gốc đượ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. Để giữ lại bộ đếm danh tính, hãy sử dụng DELETE thay thế.

Lưu ý

Thao tác TRUNCATE TABLE có thể được khôi phục.

Hạn chế

Bạn không thể sử dụng TRUNCATE TABLE trên các bảng:

  • Được tham chiếu bởi một ràng buộc NGOẠI KHÓA. Bạn có thể cắt bớt một bảng có khóa ngoại tự tham chiếu.

  • Tham gia vào chế độ xem được lập chỉ mục.

  • Được xuất bản bằng cách sử dụng sao chép giao dịch hoặc sao chép hợp nhất.

  • Có phiên bản hệ thống tạm thời.

  • Được tham chiếu bởi một ràng buộc EDGE.

Đối với các bảng có một hoặc nhiều đặc điểm này, hãy sử dụng câu lệnh DELETE để thay thế.

BẢNG TRUNCATE không thể kích hoạt trình kích hoạt vì thao tác này không ghi nhật ký các lần xóa hàng riêng lẻ. Để biết thêm thông tin, hãy xem TẠO TRIGGER (Giao dịch-SQL) .

Trong Phân tích Azure Synapse và Hệ thống Nền tảng Analytics (PDW):

  • BẢNG TRUNCATE không được phép trong câu lệnh EXPLAIN.

  • BẢNG TRUNCATE không thể chạy trong giao dịch.

Cắt bớt các bảng lớn

Microsoft SQL Server có khả năng loại bỏ hoặc cắt bớt các bảng có hơn 128 phạm vi mà không cần giữ khóa đồng thời trên tất cả các phạm vi cần thiết để loại bỏ.

Quyền

Quyền tối thiểu được yêu cầu là ALTER trên table_name. Các quyền TRUNCATE TABLE được mặc định cho chủ sở hữu bảng, thành viên của vai trò máy chủ cố định sysadmin db_owner db_ddladmin vai trò cơ sở dữ liệu cố định và không thể chuyển nhượng. Tuy nhiên, bạn có thể kết hợp câu lệnh TRUNCATE TABLE trong một mô-đun, chẳng hạn như một thủ tục được lưu trữ và cấp quyền thích hợp cho mô-đun bằng mệnh đề EXECUTE AS .

Ví dụ

A. Cắt bớt một bảng

Ví dụ sau đây xóa tất cả dữ liệu khỏi bảng JobCandidate . Các câu lệnh SELECT được đưa vào trước và sau câu lệnh TRUNCATE TABLE để so sánh kết quả.

  SỬ DỤNG AdventureWorks2012;
ĐI
CHỌN ĐẾM (*) AS BeforeTruncateCount
TỪ HumanResources.JobCandidate;
ĐI
BẢNG TRUNCATE HumanResources.JobCandidate;
ĐI
CHỌN COUNT (*) AS AfterTruncateCount
TỪ HumanResources.JobCandidate;
ĐI
 

B. Cắt ngắn các phân vùng trong bảng

Áp dụng cho : SQL Server (SQL Server 2016 (13.x) đến phiên bản hiện tại )

Xem Thêm  Làm cách nào để đặt giá trị mặc định cho một phần tử HTML

Phản hồi gần đây

Không có bình luận nào để hiển thị.