Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> SQL Server

Lệnh TRUNCATE TABLE trong SQL Server

Lệnh TRUNCATE TABLE dùng để xóa tất cả bản ghi từ một bảng trong SQL Server. Lệnh này hoạt động tương tự DELETE nhưng không có mệnh đề WHERE.

Cú pháp lệnh TRUNCATE TABLE trong SQL Server

TRUNCATE TABLE [ten_CSDL.] [ten_schema.] ten_bang
[ WITH (PARTITIONS (so_phan_vung
  | so_phan_vung TO so_phan_vung
  | so_phan_vung TO so_phan_vung) ) ];

Tham số

ten_CSDL: Tùy chọn. Nếu chỉ định, đây là tên cơ sở dữ liệu.

ten_schema: Tùy chọn. Tên schema (lược đồ) mà bảng thuộc về.

ten_bang: Bảng muốn xóa bản ghi.

WITH (PARTITIONS (so_phan_vung | so_phan_vung TO so_phan_vung): Tùy chọn, chỉ dùng với bảng phân vùng (partitioned table). Nếu chỉ định, so_phan_vung là số vùng muốn xóa. Để xóa nhiều vùng, dùng dấu phẩy tách giá trị hoặc dải số phân vùng. Nếu dùng mệnh đề này với bảng không phân vùng, SQL Server báo lỗi. Tính năng này không có trong tất cả phiên bản SQL Server.

Lưu ý

  1. Nếu xóa tất cả bản ghi trong bảng, bộ đếm ở mọi cột IDENTITY sẽ được đặt lại từ đầu.
  2. Không thể xóa tất cả bản ghi trong bảng được tham chiếu bởi Foreign Key.
  3. Trước khi xóa toàn bộ bản ghi, phải có quyền ALTER TABLE.

Ví dụ

Trong SQL Server, xóa toàn bộ bản ghi bằng TRUNCATE là cách nhanh nhất nếu không cần lấy lại dữ liệu. Nếu bảng bị TRUNCATE, việc xóa hàng không được ghi log nên không thể rollback về trạng thái trước. TRUNCATE cũng nhẹ nhàng hơn xóa bảng bằng DROP rồi tạo mới bằng CREATE. Xem ví dụ dưới.

TRUNCATE TABLE nhanvien;

Ví dụ này xóa tất cả bản ghi trong bảng nhanvien.

Lệnh trên tương đương với lệnh DELETE dưới đây.

DELETE FROM nhanvien;

Cả hai lệnh đều xóa toàn bộ dữ liệu trong bảng. Khác biệt: với DELETE bạn có thể rollback về trước khi xóa nếu muốn, còn TRUNCATE thì không (trừ khi dùng transaction).

Xem ví dụ khác với tên cơ sở dữ liệu.

TRUNCATE TABLE totn.danhba;

Ví dụ này xóa tất cả bản ghi trong bảng danhba ở cơ sở dữ liệu tên totn.

Ví dụ với phân vùng (partitions)

Nếu muốn xóa bản ghi của 1 hoặc nhiều vùng, dùng TRUNCATE TABLE với mệnh đề WITH PARTITIONS.

TRUNCATE TABLE nhanvien
WITH (PARTITIONS (1 TO 5, 7));

Trong ví dụ này, bảng là bảng phân vùng và lệnh TRUNCATE TABLE sẽ xóa bản ghi vùng từ 1 đến 5 và vùng 7 trên bảng này.

Câu hỏi thường gặp

Q: Có thể rollback về trạng thái cũ sau khi chạy TRUNCATE TABLE trong SQL Server không?

Trả lời: Lệnh TRUNCATE TABLE có thể rollback bằng cách dùng transaction. Ví dụ:

CREATE TABLE bang_test (cot1 int);

INSERT INTO bang_test VALUES (1);
INSERT INTO bang_test VALUES (2);
INSERT INTO bang_test VALUES (3);

-- Tạo transaction
BEGIN TRAN;

-- Xóa bản ghi trong bảng
TRUNCATE TABLE dbo.bang_test;

-- Rollback bảng đã xóa bản ghi
ROLLBACK;

SELECT * FROM bang_test;

Lệnh SELECT trên sẽ trả về kết quả các bản ghi sau:

cot1
----------
1
2
3

Vậy trạng thái cơ sở dữ liệu đã được khôi phục về trạng thái cũ và 3 bản ghi vẫn còn trên bang_test.