sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样。但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与delete区别。

我们先看一下truncate table的说明:
删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE在功能上与没有WHERE子句的DELETE语句相同;但是,TRUNCATE TABLE速度更快,使用的系统资源和事务日志资源更少。

truncate table的语法:

truncate table 要删除数据的表名

区别:
1,truncate删除数据后,表中标识列重置为定义的种子值,也就是标识列重新开始计数,而使 
用delete删除数据,则会保留标识计数器,新的自增量会从删除前的最大值开始计数。

2,使用truncate删除数据将不触发触发器,而delete会触发delete触发器。

3,truncate所占用的事务日志空间会很少,因为truncate不会计录删除过程,而delete每删除一行数据,都会在事务日志中记录一条数据,已便日后能够恢复数据。也就是说,使用truncate删除的数据不可恢复,但速度比delete要快很多。而通过delete删除的数据可以通过备份文件来恢复。

4,truncate是一个ddl语言,它会被隐式提交,所以不能通过rollback命令来撤消truncate命令。

以上四点为比较重要的部分,知道了上面四点后,也就大概能够清楚的了解什么时候用truncate,什么时候用delete了。

以下为比较抽象的区别:
5,truncate使用的锁比较少,因为使用truncate table时是锁定表和页,而使用delete则是锁定表中的所有行以便删除。

6,使用delete删除所有数据,在表中仍会留下一个空页,也就是删除前的数据所占用的空间还被占用着,不会释放掉(当前可以通过其它命令来释放),而使用truncate table则不会留下任何页。

7,truncate会重新设置表的索引,所以使用truncate操作后的表的索引速度会比delete操作后的表要快一些。

注意:虽然truncate table在删除数据的速度上会占有一定的优势,但并不是在所有的情况我们都可以使用truncate,存在以下情况就使用truncate就会失败。
1,要删除数据的表包含foreign key约束,而delete则可以通过级联删除来删除相关联的数据。
2,被索引视图引用过的表,也不能使用truncate.

以上为本人整理的truncate table与delete之间的区别,有不对或漏掉的部分请大家指出来,一起讨论。

时间: 2024-10-06 03:59:34

sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)的相关文章

sql语句中---删除表结构drop,truncate和delete的异同点

参考别人总结,此内容仅供自己学习 一.sql中的语法 1.drop table 表名称                                      eg:drop table dbo.Sys_Test 2.truncate table 表名称                                eg:truncate table dbo.Sys_Test 3.delete from 表名称 where  列名称=值       eg:delete from dbo.Sys

【半转贴】解决SQL SERVER 2008数据库表中修改字段后不能保存

SQL SERVER 2008数据库表中修改字段后不能保存,这种情况将阻止保存要求重新创建表的更改一项的钩钩去掉就OK了 找到工具>选项>Designers>表设计器和数据库设计器 然后将“阻止保存要求重新创建表的更改” 的这一项的钩钩去掉就OK了 图片来自:http://www.jb51.net/article/42727.htm 刚好碰到这个问题,用的就是上面的方法解决的 [半转贴]解决SQL SERVER 2008数据库表中修改字段后不能保存

sql server:删除表数据,标识列Id从1开始

在sql server数据库上创建有自增列的数据表,每次删除表的数据后,自增主键都无法自动从1开始计数.用下面三个单词就可以轻松搞定: TRUNCATE  TABLE  TbName   --TbName是表名

sql server 2008 删除数据库中所有表的数据

if exists (select * from sysobjects where type='P' and name=N'P_DeleteAllData' )    drop procedure P_DeleteAllDatagoCREATE PROCEDURE P_DeleteAllDataas    EXEC sp_MSforeachtable  'ALTER TABLE ? NOCHECK CONSTRAINT ALL' --禁用约束    EXEC sp_MSforeachtable 

SQL Server批量向表中插入多行数据语句

因自己学习测试需要,需要两个有大量不重复行的表,表中行数越多越好.手动编写SQL语句,通过循环,批量向表中插入数据,考虑到避免一致问题,设置奇偶行不同.个人水平有限,如有错误,还望指正. 语句如下: 1 --批量向表中插入大量数据语句(奇偶不同) 2 3 --判断测试表是否存在,存在则先删除再创建 4 if exists(select 1 from sysobjects where xtype='u' and name='table_test' ) 5 drop table table_test

SQL Server 向堆表中插入数据的过程

堆表中  IAM 记录着的数据页,表的各个数据页之间没有联系.也就是说一个页面它不会知道自己的前一页是谁,也不知道自己的后一页是谁. 插入数据时先找到IAM页,再由pfs(page free space)决定插入到哪里!

SQL SERVER数据库的表中修改字段的数据类型后,不能保存

在数据库里面建了一个表,可是由于对SQL SERVER的建表功能不熟悉,不知道把主键设成什么是好,就先设置了个TEXT类型,可是后来朋友们告诉我说,TEXT类型容易让数据文件变得很大,还 是改成一个int型比较好.就打算修改字段类型.可是总是提示不让我修改,那个意思就是说你只能重建这个表.ACCESS都可以让随便修改类型,为啥 SQL SERVER就不行,不信这个邪,还是问问专业测试SQL SERVER的人员吧,问了半天没有反应,看来还是得自己去BAIDU一下,这次搜索很顺利,直接找到了心满意足

sql server数据库的表中修改一个表的字段的数据类型后,不能保存

一个表中的一个字段 student(sno, sname, age) sname 类型 nchar(10) 修改成int 保存时报错. 这个是SQL SERVER自身默认设置的问题,它默认为不能修改类型. 只需要在"tool->option->Designer ->Table and Database designers 中 去掉prvent saving changes that require table re-created."就可以了, 欧克了,在保存刷新.

SQL SERVER数据库的表中修改字段属性被阻止“Prevent saving changes that require table re-creation”

1.启动SQL SERVER,选择工具—>选项,去掉“ 阻止保存要求重新创建表的更改”前面的勾. 2.选择设计器 3.去掉“阻止保存要求重新创建表的更改”前面的对号,点击OK. 重新启动SQL SERVER就可以了 .