SQL Server中DELETE和TRUNCATE的區別

​DELETE和TRUNCATE語句之間的區別是求職面試中最多見的問題之一。這兩條語句均可以從表中刪除數據。然而,也有不一樣之處。面試

本文將重點討論這些差別,並經過實例加以說明。sql

TRUNCATEurl

DELETEspa

從表中刪除全部記錄。咱們不能使用WHERE刪除特定的記錄.net

刪除全部記錄,並可使用WHERE刪除特定記錄。日誌

不觸發DELETE觸發器。code

觸發DELETE觸發器server

重置標識列事務

不重置標識列ci

因爲日誌不多,因此速度更快。

因爲執行了表掃描,以計算要刪除的行數,並逐個刪除行,因此會更慢。更改被記錄在事務日誌中。

使用行級鎖

使用表級鎖

須要ALTER TABLE權限

須要表的DELETE 權限

出於演示的目的,我建立了一個名爲studentDB的表。除此以外,又建立了兩個表,tblSchool和tblStudent,並在這兩個表中插入了一些記錄。

下面的語句建立了tblStudent表:

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

下面的語句建立了tblSchool表:

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

將數據插入到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

將數據插入到tblSchool表中:

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

如今,咱們來看看二者的不一樣之處。

1. 刪除數據

DELETE命令的做用是從表中刪除特定的/全部記錄。TRUNCATE語句刪除全部數據。

  • DELETE

要使用DELETE刪除特定記錄,能夠在查詢中使用WHERE子句。假設咱們想從tblstudent表中刪除一些學生,該學生的代碼是ST002。在DELETE語句中添加以下條件:

Delete from  tblstudent where student_code='ST002'

執行後,將只刪除表中的一條記錄。一旦記錄被刪除,運行select查詢查看數據:

  • TRUNCATE

在truncate中,添加WHERE子句是不可能的。下面的查詢刪除了tblStudent表中的全部記錄:

Truncate table tblStudent

2. 觸發器

當咱們運行DELETE語句時,SQL會調用DELETE觸發器。

我已經在tblStudent上建立了一個名爲trgdeleteStudent的觸發器。當對tblstudent表執行DELETE語句時,觸發器將在tblDeletedStudent表中插入一條記錄。

建立tbldeletedStudent的T-SQL代碼以下:

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

下面的代碼建立了觸發器:

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

運行如下查詢刪除學生ST0001的記錄:

delete from tblstudent where student_code='ST001'

執行如下查詢命令進行驗證:

select * from [dbo].[tblDelatedStudents]

 

正如上面的截圖中看到的,一條記錄被添加到tblDelatedStudents表中。

如今,讓咱們運行TRUNCATE TABLE語句來刪除tblstudent表中的數據:

Truncate table [dbo].[tblDelatedStudents]

經過查詢tblDeletedStudent來驗證數據:

select * from [dbo].[tblDelatedStudents]

 

如你所見,tblDeletedStudent表中沒有插入記錄。所以,trgdeletestudent觸發器沒有被觸發。

3. 重置標識列

當執行DELETE語句時,標識列不會重置爲初始值。對於TRUNCATE 語句,標識列將重置。

  • DELETE

執行DELETE語句刪除tblStudent表中的數據:

delete from tblStudent where student_code='ST004'

而後,執行如下insert語句,向表tblStudent添加記錄:

insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Ramesh Upadhyay','ST007','B',2)
Go

執行以下查詢命令查看tblStudent的數據:

select * from [dbo].[tblStudent]

 

這裏顯示初始標識列值加1。

  • TRUNCATE

執行如下TRUNCATE語句刪除tblStudent表中的數據:

Truncate table [dbo].[tblStudents]

刪除數據後,在表中插入記錄:

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

執行以下查詢命令查看tblStudent的數據:

select * from [dbo].[tblStudent]

 

綜上所述,標識列被重置了。

4. 權限

要使用DELETE語句刪除數據,必須對錶具備DELETE權限。要使用TRUNCATE TABLE語句刪除數據,咱們須要ALTER TABLE權限。

  • DELETE

我已經建立了一個名爲testuser1的用戶,並在tblStudent表上分配了刪除權限。

咱們刪除student_code=ST001的學生記錄:

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

接着查看tblStudent的數據:

它確實從表中刪除了記錄。

  • TRUNCATE

如今,運行TRUNCATE刪除數據:

use StudentDB
go
truncate table tblstudent

查詢返回以下錯誤:

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

爲了糾正這個問題,咱們必須分配ALTER TABLE權限。執行如下查詢,授予tblStudent表訪問權限:

grant ALTER on tblstudent to testuser1

從新執行truncate:

use StudentDB
go
truncate table tblstudent

結果以下:

 

表中的數據被刪除。

本文解釋了DELETE語句和TRUNCATE 之間的區別。咱們指出了常見的區別,並經過示例進行了說明。

原文連接:https://codingsight.com/difference-between-delete-and-truncate-table-in-sql-server/

相關文章
相關標籤/搜索