Sql 删除行后重用标识值

Sql 删除行后重用标识值,sql,sql-server,tsql,sql-server-2008,identity,Sql,Sql Server,Tsql,Sql Server 2008,Identity,在SQL Server 2008 Express中删除行后是否可以重用标识字段值?这里有一个例子。假设我有一个Id字段作为主键(标识)的表。如果我添加五行,我将有这5个ID:1、2、3、4、5。如果我删除这些行,然后再添加五行,那么新行的ID是:6、7、8、9、10。可以让它在1点重新开始吗 我是否必须从另一个表中删除数据才能完成此操作?感谢您的帮助。identity字段默认情况下不重用旧值。您可以使用重新设定种子,但不建议这样做,因为如果您将种子重新设定到表中仍然存在的值以下,则会出现密钥冲突

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


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

identity
字段默认情况下不重用旧值。您可以使用重新设定种子,但不建议这样做,因为如果您将种子重新设定到表中仍然存在的值以下,则会出现密钥冲突。一般来说,您不应该关心PK值是什么。它们不是连续的这一事实不会造成任何伤害。

您可以使用以下方法设置标识值:

DBCC CHECKIDENT (orders, RESEED, 999)
这意味着您必须基于每次删除运行语句。这应该开始强调为什么这是个坏主意


数据库不关心顺序值-仅用于表示。

如果要在删除所有行后重置标识,请执行以下操作之一

--instead of delete, resets identity value
TRUNCATE TABLE orders

--or if TRUNCATE fails because of FKs, use this after DELETE
DBCC CHECKIDENT (orders, RESEED, 1)

否则,内部值不应与是否存在间隙有关。

您是指标识字段吗?几乎我所有的表的主键都是ID,它通常(尽管不是唯一的)是一个标识字段是的,我指的是一个标识字段。有办法做到这一点并不意味着你应该这样做。事实上,它们不是连续的,实际上会造成一些伤害,因为删除的值不会被重用。由于32位标识列最多只能插入和删除2^32(如果不包括负值,则为2^31),插入和删除之后将导致溢出错误。这本质上是一种资源泄漏。我做了一些计算,确定一个32位的标识列不是未来的证明,甚至一个64位的列也可能不够,因为一台计算机只比我的桌面快1000倍左右,就可以在不到一年的时间内吃掉这些值。所以128位GUIDs FTW。使用bigint作为标识列可以得到2^63-1行。那是九千五百万行。即使每天插入一万亿次,这仍然会持续25000年。如果你想插入ID为10的行,你应该用ID为9重新设置种子。假设增量为1。您也可以使用此值来查找当前种子值:选择ident_current('table_name')作为当前种子标识