首页 > 解决方案 > 重用已删除行的标识值

问题描述

在 SQL Server 2008 Express 中删除行后是否可以重用标识字段值?这是一个例子。假设我有一个以 Id 字段作为主键(身份)的表。如果我添加五行,我将有这 5 个 Id:1、2、3、4、5。如果我要删除这些行,然后再添加五行,新行将有 Id:6、7、8, 9, 10. 可以让它从 1 重新开始吗?

我是否必须从另一个表中删除数据才能完成此操作?谢谢你的帮助。

标签: sqlsql-server

解决方案


在 SQL Server 2008 Express 中删除行后是否可以重用标识字段值?

是的,但这是您可能做出的最糟糕的决定之一

这太糟糕了,我不会解释如何做到这一点,但只是为什么这很糟糕。

我们使用标识列来生成与表中包含的数据无关的值。

  • 如果我们使用身份作为主键并重用它们的值,那么同一个键将在整个时间内保存 2 个(或更多)不同的实体,特别是在生成报告或拥有使用此键且没有引用的其他表时会造成混淆正直。
  • 当行数增加时,用于识别未使用值(臭名昭著的间隙和孤岛问题)的解决方案非常缓慢。随着行的堆积,这会使性能下降。
  • 每次在表上插入行时,您都必须应用此“未使用的数字”逻辑,因此在维护任务中要记住另一件事。
  • 重用这些数字几乎没有好处,因为INT或者BIGINT最大值足以支持大多数业务数据。
  • 将身份用作主键或与聚集索引一起使用是很常见的,因为新记录将被插入到最后,从而减少了碎片。一旦记录被删除,它会在页面(瑞士奶酪页面)之间产生间隙,这可以通过重建索引来解决。问题出现在重建之后,您可能会在其中大量插入新记录并导致大量页面拆分,从而不必要地影响性能。

当您实际上需要填充标识列中的空白时,我无法想到一个真实的案例,因为此值的目的是与表所代表的实体无关。


推荐阅读