重用已删除行的标识值

时间:2018-05-17 06:02:53

标签: sql sql-server

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

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

4 个答案:

答案 0 :(得分:2)

  

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

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

这太糟糕了,我不会解释怎么做,但这就是为什么这很糟糕。

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

  • 如果我们使用身份作为主键并且我们重复使用它们的值,则相同的密钥将在整个时间内容纳2个(或更多个)不同的实体,特别是在生成报告或使用其他表使用此密钥时,会产生混淆并且#&# 39;具有参照完整性。
  • 当行数增加时,用于识别未使用值(臭名昭着的间隙和岛屿问题)的解决方案非常慢。这会导致性能随着行堆积而下降。
  • 您必须应用此"未使用的号码"每次在表格上插入行时都要记住逻辑,因此在维护任务时要记住另一件事。
  • 重复使用这些数字几乎没有任何好处,因为INTBIGINT最大值足以支持大多数商家数据。
  • 将标识用作主键或使用聚簇索引很常见,因为最后会插入新记录,从而减少碎片。删除记录后,会在页面之间产生间隙(瑞士奶酪页面),这可以通过索引重建来解决。问题出现在重建之后,您可能会在其间大量插入新记录并导致大量页面拆分,从而不必要地达到性能。

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

答案 1 :(得分:1)

如果您要删除表格中的所有数据,可以使用TRUNCATE TABLE,这将帮助您删除表格中的整个数据并重置身份以从SEED值开始。

TRUNCATE TABLE MyTable

您还可以使用DBCC CHECKIDENT将您的身份重新设置为特定值。

DBCC CHECKIDENT ('dbo.MyTable', RESEED, 1);

以下代码将reed身份从1开始。

最后,如果你需要弥补差距,你需要知道,使用IDENTITY你可以弥补差距,你需要实现自定义功能,使其像IDENTITY一样,并弥补差距。

答案 2 :(得分:0)

如果您从Autoincrement删除ID属性,则可能。

您可以检查表格是否为空,并INSERT相应值。

答案 3 :(得分:0)

我们可以通过两种方式来做到这一点。

如果是非Pk列,请插入具有相同标识号的记录,然后删除先前的标识列值。

如果您不需要owl数据,请删除该表并重新创建该表或截断该表并使用DBCC CHECKIDENT将您的标识重新设置为特定值。