SQLSERVER truncate table之后是否会重置表的自增值

今天清理业务库数据的时候,开发人员说可以使用truncate table把两个表的所有数据清理掉

这两个表都有自增ID,都做了表分区,单表200GB,使用 SELECT IDENT_CURRENT('') 的时候两个表

的当前自增值是3000012,这两个表几乎是一模一样的,除了一两个字段不一样

我执行两个SQL语句把两个表都truncate掉,然后就忘记了收缩数据库和重置种子值

由于分区函数的最后一个值是2000000,那么后插入的数据都会积聚在最后一个文件组

1、重置种子值,让数据重新利用第一个文件组

2、修改分区方案,使用 split range,向分区函数添加新值

虽然不重置也可以,但是如果使用 split range,向分区函数添加新值工作量就大了,为了不增加工作量当然重置种子值最好

因为当时太忙,继续搬数据库去了

下班回来才想起这件事,还需要收尾工作,马上远程到业务数据库的机器,使用下面的SQL语句查看分区情况

--分区情况
SELECT pat.* ,
fg.[groupname] AS '分区方案对应的文件组名称' ,
patsch.name '当前分区函数对应的分区方案'
FROM sys.destination_data_spaces AS dds
INNER JOIN sysfilegroups AS fg ON dds.[data_space_id] = fg.[groupid]
INNER JOIN ( SELECT $PARTITION.Fun_New_PostLog_Id(id) AS 分区编号 ,
MIN(id) AS Min_value ,
MAX(id) AS Max_value ,
COUNT(id) AS 记录数
FROM dbo.PostLog
GROUP BY $PARTITION.Fun_New_PostLog_Id(id)
) AS pat ON pat.[分区编号] = dds.[destination_id]
INNER JOIN sys.partition_schemes AS patsch ON dds.[partition_scheme_id] = patsch.data_space_id
ORDER BY pat.[分区编号]

发现两个表的新插入的数据都放在第一个文件组,并且自增id又从1开始了

马上测试一下,结果发现truncate table真的重置了种子,以前是知道的,不过以前用到truncate的情况很少

USE [test]
GO
CREATE TABLE truncatetabletestidentity (id INT IDENTITY(1,1),NAME NVARCHAR(20))
GO INSERT [dbo].[truncatetabletestidentity]
SELECT 'ni' UNION ALL
SELECT 'we' UNION ALL
SELECT 'pp' SELECT * FROM [dbo].[truncatetabletestidentity]
GO TRUNCATE TABLE [dbo].[truncatetabletestidentity]

接下来收缩数据库,磁盘空间又“多出“了450GB空间,磁盘预警消失了~

如有不对的地方,欢迎大家拍砖o(∩_∩)o

2014-4-7补充:

在MSDN里面提到

DBCC CHECKIDENT (Transact-SQL)

DBCC CHECKIDENT (table_name, RESEED,new_reseed_value )

将当前标识值设置为 new_reseed_value。 如果自从创建表以来未在表中插入任何行,或者已使用 TRUNCATE TABLE 语句删除所有行,则在运行 DBCC CHECKIDENT 之后插入的第一行将使用 new_reseed_value 作为标识。 否则,插入的下一行将使用new_reseed_value + 当前增量值。

如果该表不为空,那么将标识值设置为小于标识列中的最大值的数字时,将会出现下列情况之一:

  • 如果标识列中存在 PRIMARY KEY 或 UNIQUE 约束,则随后在表中执行插入操作时将生成错误消息 2627,原因是生成的标识值将与现有值冲突。

  • 如果不存在 PRIMARY KEY 或 UNIQUE 约束,则随后的插入操作将产生重复的标识值。

SQLSERVER truncate table之后是否会重置表的自增值的更多相关文章

  1. SQL Server 2008 R2——TRUNCATE TABLE 无法截断表 该表正由 FOREIGN KEY 约束引用

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  2. MySql清空表的方法介绍 : truncate table 表名

    清空某个mysql表中所有内容 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate tabl ...

  3. 【转载】delete table 和 truncate table 的区别

    使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where] 将XS表中的所有行数据删除 delete XS 执行完后,发现X ...

  4. truncate table 和delete

    delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...

  5. delete table 和 truncate table

    delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...

  6. Oracle 使用TRUNCATE TABLE删除所有行

    若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速.有效的方法.TRUNCATE TABLE 与不含 WHERE 子句的 DELETE 语句类似.但是,TRUNCATE TABLE ...

  7. TRUNCATE TABLE 与 DELETE (转)

    TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作.TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快, ...

  8. TRUNCATE TABLE (Transact-SQL)

    删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似:但是,TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源 ...

  9. SQL Server数据恢复准备之TRUNCATE TABLE理解

    SQL Server数据恢复准备之TRUNCATE TABLE理解 转自:https://blog.51cto.com/aimax/2142553 易语随风去关注0人评论6717人阅读2018-07- ...

随机推荐

  1. VMware 中windows server 之DHCP 搭建与测试

    感悟: 由于打算将windows server 的服务器搭建维护从头重新学习总结一下,遇到搭建dhcp服务的时候,在虚拟机中一直测试不成功,耽误我好几星期了,一点也不夸张,心情和积极性也大大受到打击. ...

  2. 建议Javascript以后都用严格模式

    建议以后都在js文件的头部加上 "use strict"; 现在主流的浏览器都支持,不支持的浏览器也会忽略掉. 可以使我们写的更规范,可控: 有些错误编译的时候就会出现,方便排错:

  3. 2.擦除开发板iNand中的uboot的方法

    (1)在linux和android系统下,擦除uboot的方法:       busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 seek=1 c ...

  4. nginx的一些介绍和使用

    nginx 的安装 我们首先进行下载安装:http://nginx.org/download/nginx-1.4.2.tar.gz 安装准备: nginx依赖于pcre库,要先安装pcre 1 yum ...

  5. ComboBox的数据绑定

    这里的ComboBox指System.Windows.Forms中的ComboBox. 使用对象数据源 IList<Model> models = ModelService.GetAllM ...

  6. ecshop 商品页面添加商品标签:

    /* @脚垫客户 需要给商品加属性.最简单粗暴的办法.后台调用加入.界面没有美化. */ goods.dwt <ul class="quantity"> <h2& ...

  7. 实现textarea限制输入字数(包含中文只能输入10个,全ASCII码能够输入20个)

    document.getElementById("<%=textBox1.ClientID %>").value 实现textarea限制输入字数(包含中文只能输入10 ...

  8. 2.Mybatis入门程序(单表的增删改成)

    这里讲的单表的增删改查,是由mapper代理的增删改查,先来看看步骤: 1.jar包的导入 2.配置全局的配置文件 3.建立接口 4.编写mapper.xml 5.测试 工程结构:这个你们自己可以调整 ...

  9. 循序渐进Python3(六) -- 初识内置变量、反射、递归

    #python用下划线作为变量前缀和后缀指定特殊变量.稍后我们会发现,   #对于程序来说,其中的有些变量是非常有用的,而其他的则是未知或者无用的.   #我们总结一下Python中下划线的特殊用法  ...

  10. ORACLE 数据块dump

    1. rdba(Tablespace relative database block address) 是相对数据块地址,是数据所在的地址,rdba可就是rowid 中rfile#+block#. 根 ...