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

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

Nhiều bài báo đã được viết để mô tả sự khác biệt giữa các câu lệnh SQL DELETE và SQL TRUNCATE. Hơn nữa, nó là một trong những câu hỏi phổ biến nhất trong các cuộc phỏng vấn xin việc. Cả hai câu lệnh đều xóa dữ liệu khỏi bảng. Tuy nhiên, cũng có sự khác biệt.

Bài viết này sẽ tập trung vào những điểm khác biệt này và minh họa chúng bằng các ví dụ thực tế.

Tóm tắt về sự khác biệt Xóa so với Cắt ngắn

Câu lệnh bảng cắt ngắn Tuyên bố DELETE
Xóa tất cả các bản ghi khỏi bảng. Chúng tôi không thể áp dụng mệnh đề WHERE để xóa các bản ghi cụ thể. Xóa tất cả các bản ghi và có thể áp dụng mệnh đề WHERE để xóa các bản ghi cụ thể.
không kích hoạt DELETE kích hoạt. Thực thi XÓA kích hoạt.
Đặt lại giá trị nhận dạng. Không đặt lại giá trị nhận dạng.
Nhanh hơn do sử dụng nhật ký giao dịch tối thiểu. chậm hơn do thực hiện quét bảng ban đầu để đếm số hàng cần xóa và xóa từng hàng một. Các thay đổi được ghi vào nhật ký giao dịch.
Sử dụng khóa cấp hàng. Sử dụng khóa cấp bảng.
Không thể được sử dụng với các chế độ xem được lập chỉ mục. Có thể được sử dụng với các chế độ xem được lập chỉ mục.
Yêu cầu BẢNG ALTER sự cho phép. Yêu cầu XÓA quyền trên bảng.

Với mục đích trình diễn, tôi đã tạo một bảng có tên studentDB . Ở đó, tôi đã tạo được hai bảng, tblSchool tblStudent và chèn một số bản ghi trong cả hai bảng.

Tập lệnh sau tạo tblStudent bảng:

CREATE TABLE [dbo].[tblStudent](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[student_name] [varchar](250) NOT NULL,
	[student_code] [varchar](5) NOT NULL,
	[student_grade] [char](2) NOT NULL,
	[SchoolID] [int] NOT NULL,
 CONSTRAINT [PK_tblStudent] PRIMARY KEY CLUSTERED 
( [ID] ASC))
GO
ALTER TABLE [dbo].[tblStudent]  WITH CHECK ADD  CONSTRAINT [FK_tblStudent_tblSchool] FOREIGN KEY([SchoolID])
REFERENCES [dbo].[tblSchool] ([School_ID])
GO

ALTER TABLE [dbo].[tblStudent] CHECK CONSTRAINT [FK_tblStudent_tblSchool]
GO

Tập lệnh này tạo tblSchool bảng:

CREATE TABLE [dbo].[tblSchool](
	[School_ID] [int] IDENTITY(1,1) NOT NULL,
	[School_Name] [varchar](500) NULL,
	[City] [varchar](50) NULL,
CONSTRAINT [PK_tblSchool] PRIMARY KEY CLUSTERED 
([School_ID] ASC)) ON [PRIMARY]
GO

Tập lệnh sau sẽ chèn dữ liệu vào tblStudent bảng:

Giá trị
/*Insert Data in tblStudent*/
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Nisarg Upadhyay','ST001','A',1),
('Nirali Upadhyay','ST002','B',1),
('Dixit Upadhyay','ST003','A',1),
('Bharti Upadhyay','ST004','C',2),
('Nimesh Patel','ST005','C',2),
('Raghav Dave','ST006','A',1)
Go

Tập lệnh bên dưới chèn dữ liệu vào tblSchool bảng:

insert into [dbo].[tblSchool] ([school_name], [city]) 
values 
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')

Bây giờ, hãy xác định sự khác biệt giữa các câu lệnh.

Sự khác biệt 1:Xóa dữ liệu

Lệnh DELETE có tác dụng xóa các bản ghi cụ thể / tất cả khỏi bảng. Câu lệnh TRUNCATE xóa tất cả dữ liệu.

Chúng ta sẽ khám phá tình huống này.

Tuyên bố DELETE

Để loại bỏ các bản ghi cụ thể bằng DELETE, chúng ta có thể sử dụng mệnh đề WHERE trong truy vấn. Giả sử chúng tôi muốn xóa một số sinh viên khỏi tblstudent bảng, mã của sinh viên là ST002 .

Thêm bộ lọc trong câu lệnh DELETE như sau:

Delete from  tblstudent where student_code='ST002'

Truy vấn này sẽ chỉ xóa một bản ghi khỏi bảng.

Sau khi bản ghi bị xóa, hãy chạy chọn truy vấn để xem dữ liệu:

Select * from tblstudent

Tuyên bố BẢNG TRUNCATE

Trong bảng cắt ngắn, không thể thêm mệnh đề WHERE.

Truy vấn sau đây xóa tất cả các bản ghi khỏi tblStudent bảng:

Truncate table tblStudent

Sự khác biệt 2:Trình kích hoạt

Khi chúng tôi chạy lệnh DELETE, Máy chủ SQL sẽ gọi các trình kích hoạt DELETE.

Tôi đã tạo trình kích hoạt có tên trgdeleteStudent trên tblStudent . Khi chúng tôi thực hiện câu lệnh DELETE trên tblstudent , trình kích hoạt sẽ chèn bản ghi trong tblDeletedStudent bảng.

Mã T-SQL để tạo tbldeletedStudent như sau:

CREATE TABLE [dbo].[tblDelatedStudents]
(
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Student_Code] [varchar](10) NULL,
	CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)

Mã T-SQL dưới đây tạo trình kích hoạt:

create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE 
AS 
INSERT INTO [dbo].[tblDelatedStudents](student_code)
  SELECT student_code
FROM DELETED;
GO

Chạy truy vấn bên dưới để xóa hồ sơ của sinh viên ST0001 :

delete from tblstudent where student_code='ST001'

Chạy truy vấn sau để xác minh:

select * from [dbo].[tblDelatedStudents]

Như bạn có thể thấy trong ảnh chụp màn hình ở trên, một bản ghi đã được thêm vào bảng.

Bây giờ, chúng ta hãy chạy câu lệnh TRUNCATE TABLE để xóa dữ liệu khỏi tblstudent bảng:

Truncate table [dbo].[tblDelatedStudents]

Xác minh dữ liệu bằng cách truy vấn tblDeletedStudent :

select * from [dbo].[tblDelatedStudents]

Như bạn có thể thấy, các bản ghi chưa được chèn vào bảng tblDeletedStudent Do đó, trgdeletestudent trình kích hoạt không kích hoạt.

Sự khác biệt 3:Đặt lại các giá trị nhận dạng

Khi chúng tôi thực hiện lệnh DELETE, các giá trị nhận dạng sẽ không được đặt lại về giá trị ban đầu. Đối với việc thực thi câu lệnh bảng TRUNCATE, giá trị nhận dạng sẽ được đặt lại.

Tuyên bố DELETE

Chạy câu lệnh DELETE bên dưới để xóa dữ liệu khỏi tblStudent bảng:

delete from tblStudent where student_code='ST004'

Sau đó, thực hiện truy vấn chèn sau để thêm bản ghi vào tblStudent bảng:

Các giá trị
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Ramesh Upadhyay','ST007','B',2)
Go

Chạy truy vấn sau để xem dữ liệu của tblStudent :

select * from [dbo].[tblStudent]

Hình ảnh trên cho thấy rằng giá trị cột nhận dạng ban đầu được tăng lên một.

BẢNG TRUNCATE

Chạy câu lệnh TRUNCATE TABLE bên dưới để xóa dữ liệu khỏi tblStudent bảng:

Truncate table [dbo].[tblStudents]

Sau khi dữ liệu bị xóa, hãy chèn các bản ghi vào bảng:

Các giá trị
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Nisarg Upadhyay','ST001','A',1),
('Nirali Upadhyay','ST002','B',1),
('Dixit Upadhyay','ST003','A',1),
('Bharti Upadhyay','ST004','C',2),
('Nimesh Patel','ST005','C',2),
('Raghav Dave','ST006','A',1)
Go

Chạy truy vấn CHỌN để xem dữ liệu:

select * from [dbo].[tblStudent]

Như bạn có thể thấy trong hình trên, giá trị nhận dạng đã được đặt lại.

Sự khác biệt 4:Quyền

Để xóa dữ liệu bằng câu lệnh DELETE, chúng ta phải có quyền DELETE trên bảng.

Để xóa dữ liệu bằng câu lệnh TRUNCATE TABLE, chúng tôi yêu cầu quyền ALTER TABLE.

Tuyên bố DELETE

Tôi đã tạo người dùng có tên testuser1 và đã chỉ định quyền XÓA trên tblStudent bảng.

Chúng tôi xóa hồ sơ của sinh viên có student_code =ST001 :

use StudentDB
go
delete from tblstudent where student_code='ST001'

Chạy chọn truy vấn để xem dữ liệu:

Nó đã xóa bản ghi khỏi bảng.

BẢNG TRUNCATE

Bây giờ, hãy chạy BẢNG TRUNCATE để xóa dữ liệu:

use StudentDB
go
truncate table tblstudent

Truy vấn trả về lỗi sau:

Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.

Để khắc phục điều này, chúng tôi phải chỉ định quyền ALTER TABLE .

Chạy truy vấn sau để cấp quyền truy cập cho testuser1 trên tblStudent bảng:

grant ALTER on tblstudent to testuser1

Chạy lại câu lệnh bảng cắt ngắn:

use StudentDB
go
truncate table tblstudent

Xem dữ liệu từ bảng:

Dữ liệu đã bị xóa khỏi bảng.

Tóm tắt

Bài viết này giải thích sự khác biệt giữa câu lệnh SQL DELETE và câu lệnh SQL TRUNCATE TABLE. Chúng tôi đã xác định tất cả các tính năng cần thiết và minh họa chúng bằng các ví dụ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thêm nhiều biến được tham số hóa vào cơ sở dữ liệu trong c #

  2. DEGREES () Ví dụ trong SQL Server

  3. Cách gửi kết quả truy vấn qua email dưới dạng tệp đính kèm trong SQL Server (T-SQL)

  4. STRING_SPLIT () trong SQL Server 2016:Tiếp theo # 1

  5. Bao gồm các tháng bị thiếu trong truy vấn Nhóm Theo