为了账号安全,请及时绑定邮箱和手机立即绑定

删除SQL Server中的记录后重置标识种子

删除SQL Server中的记录后重置标识种子

红糖糍粑 2019-08-06 12:43:49
删除SQL Server中的记录后重置标识种子我已将记录插入SQL Server数据库表。该表定义了主键,并且自动增量标识种子设置为“是”。这主要是因为在SQL Azure中,每个表都必须定义主键和标识。但由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,并且索引列(自动生成的增量为1)将受到干扰。删除记录后,如何重置标识列,以使列按数字顺序递增?标识列不用作数据库中任何位置的外键。
查看完整描述

3 回答

?
MM们

TA贡献1886条经验 获得超2个赞

DBCC CHECKIDENT ('TestTable', RESEED, 0)GO

其中0是identity起始值


查看完整回答
反对 回复 2019-08-06
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

应该注意的是,如果所有数据都是通过DELETE(即无WHERE子句)从表中删除的,那么只要a)权限允许它,并且b)没有引用该表的FK(似乎是在这种情况下,使用TRUNCATE TABLE将是优选的,因为它更有效DELETE 并且同时重置IDENTITY种子。

与DELETE语句相比,TRUNCATE TABLE具有以下优点:

  • 使用较少的事务日志空间。

    DELETE语句一次删除一行,并在事务日志中为每个已删除的行记录一个条目。TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中记录页面解除分配。

  • 通常使用较少的锁。

    使用行锁执行DELETE语句时,表中的每一行都被锁定以进行删除。TRUNCATE TABLE总是锁定表(包括模式(SCH-M)锁)和页面,但不是每行。

  • 毫无例外,表格中留有零页面。

    执行DELETE语句后,表仍可以包含空页。例如,如果没有至少一个独占(LCK_M_X)表锁,则无法释放堆中的空页。如果删除操作不使用表锁,则表(堆)将包含许多空页。对于索引,删除操作可以留下空页,尽管这些页面将通过后台清理过程快速释放。

如果表包含标识列,则该列的计数器将重置为为该列定义的种子值。如果未定义种子,则使用默认值1。要保留身份计数器,请改用DELETE。

所以以下内容:

DELETE FROM [MyTable];DBCC CHECKIDENT ('[MyTable]', RESEED, 0);

变得公正:

TRUNCATE TABLE [MyTable];


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 1125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信