​DELETE和TRUNCATE语句之间的区别是求职面试中最常见的问题之一。这两条语句都可以从表中删除数据。然而,也有不同之处。

本文将重点讨论这些差异,并通过实例加以说明。

TRUNCATE

DELETE

从表中删除所有记录。我们不能使用WHERE删除特定的记录

删除所有记录,并可以使用WHERE删除特定记录。

不触发DELETE触发器。

触发DELETE触发器

重置标识列

不重置标识列

由于日志很少,所以速度更快。

由于执行了表扫描,以计算要删除的行数,并逐个删除行,所以会更慢。更改被记录在事务日志中。

使用行级锁

使用表级锁

需要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 3
Cannot 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/

SQL Server中DELETE和TRUNCATE的区别的更多相关文章

  1. SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...

  2. SQL Server中SCAN 和SEEK的区别

    SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据.这两种算法构成了查询的基础,几乎无处不在.Scan会扫描 ...

  3. [转]SQL SERVER中openrowset与opendatasource的区别

    本文转自:http://blog.sina.com.cn/s/blog_6399df820102vyy8.html SQL SERVER中openrowset与opendatasource的区别: o ...

  4. SQL SERVER 中的smalldatetime和datetime区别

    原文:SQL SERVER 中的smalldatetime和datetime区别 smalldatetime不能到秒. 不過它占的空間小.(4位) datetime(8位) 而且兩者的時間範圍不一樣. ...

  5. SQL Server中char与varchar数据类型区别

    在SQL Server中char类型的长度是不可变的,而varchar的长度是可变的 . 存入数据时: 如果数据类型为char时,当定义一个字段固定长度时,如果存进去数据长度小于char的长度,那么存 ...

  6. SQL Server中存储过程与函数的区别

    本质上没区别.只是函数有如:只能返回一个变量的限制.而存储过程可以返回多个.而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行.执行的本质都一样. 函数限制比较多,比如不能用临 ...

  7. SQL Server中Text和varchar(max) 区别

    SQL Server 2005之后版本:请使用 varchar(max).nvarchar(max) 和 varbinary(max) 数据类型,而不要使用 text.ntext 和 image 数据 ...

  8. ORACLE中DELETE和TRUNCATE的区别

    语法 delete from AA truncate table AA 区别 1.delete from后面可以写条件(也就是where子句,delete from AA where aa.列名 = ...

  9. SQL Server中Delete语句表名不能用别名

    delete from TABLEA A where A.FIELD1=10        (ORACLE适用)delete TABLEA from TABLEA A where A.FIELD1=1 ...

  10. SQL Server中DateTime与DateTime2的区别

    DateTime字段类型对应的时间格式是 yyyy-MM-dd HH:mm:ss.fff ,3个f,精确到1毫秒(ms),示例 -- ::15.433 . DateTime2字段类型对应的时间格式是  ...

随机推荐

  1. webpack进阶构建项目(一)

    webpack进阶构建项目(一) 阅读目录 1.理解webpack加载器 2.html-webpack-plugin学习 3.压缩js与css 4.理解less-loader加载器的使用 5.理解ba ...

  2. scala + intellij idea 环境搭建及编译、打包

    大数据生态圈中风头正旺的Spark项目完全是采用Scala语言开发的,不懂Scala的话,基本上就没法玩下去了.Scala与Java编译后的class均可以运行于JVM之上,就好象.NET中F#与C# ...

  3. C++矩阵运算库armadillo配置笔记

    前言 最近在用C++实现神经网络模型,优化算法需要用到矩阵操作,一开始我用的是boost的ublas库,但用着用着感觉很不习惯,接口不够友好.于是上网搜索矩阵运算哪家强,大神们都推荐armadillo ...

  4. GitHub详细教程(转载)

    1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? 1.1.2 重要的术语 1.1.3 索引 1.2 Git安装 1.3 Git配置 1.3.1 用户信息 1.3.2 高亮显示 1 ...

  5. 最新jhost免费jsp云空间会员邀请码

    jhost支持jsp.php的免费云空间,邀请码用于激活空间服务: 邀请码:20141003104317_149661                  有效期:2014-10-03 http://w ...

  6. CentOS7下使用YUM安装mariadb10

    1:由于centos7 默认使用yum安装MySQL的话就会安装mariadb,只是安装的版本停留在mariadb5.x,版本比较低.如果我们需要安装mariadb10这里就需要删除mariadb-l ...

  7. java wait和notify及 synchronized sleep 总结

    java 中线程我一直弄不清线程锁等 所以写了一些例子验证看法: 在这之前先看下API中wait中的解释: wait:方法来之java.lang.Objetc 方法翻译:在其他线程调用此对象的 not ...

  8. CentOS 7.x下安装部署MySQL 8.0实施手册

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 一.  Mysql8.0版本相比之前版本的一些特性 1) ...

  9. 使用MDI 和 XtraTabbedMdiManager 后 选项卡切换后Ribbon 合并后不选中MDI子窗...

    使用MDI 和 XtraTabbedMdiManager 后 选项卡切换后Ribbon 合并后不选中MDI子我这里是 继承 XtraTabbedMdiManager  所以,是重载的  OnSelec ...

  10. winform复制文件到指定目录

    执行步骤 弹出选择对话框:var openFileDialog = new OpenFileDialog(); 设置选择内容,如所有图片:openFileDialog.Filter="图像文 ...