删除行后重用标识值

Jer*_*emy 14 sql t-sql sql-server identity sql-server-2008

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

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

OMG*_*ies 21

您可以使用以下命令设置IDENTITY值:

DBCC CHECKIDENT (orders, RESEED, 999)
Run Code Online (Sandbox Code Playgroud)

这意味着你必须根据每个DELETE运行语句.这应该开始强调为什么这是一个坏主意......

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

  • 如果要插入 ID 为 10 的行,则应使用 ID 9 重新设定种子。假设增量为 1。 (2认同)

gbn*_*gbn 9

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

--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)
Run Code Online (Sandbox Code Playgroud)

否则,内部价值无论是否差距都无关紧要.


Don*_*nie 6

identity默认情况下,字段不会重用旧值.您可以使用重新设置它们dbcc checkident,但不建议这样做,因为如果您重新设置在表格中仍然存在的值以下,您将获得密钥违规.一般来说,你不应该关心PK值是什么.他们不连续的事实并没有伤害任何事情.

  • 使用bigint作为标识列可以获得2 ^ 63 - 1行.这是9个quintillion行.即使每天插入数万亿次,这仍将持续25,000年. (5认同)
  • 它们不连续的事实实际上确实在伤害某些事情,因为删除的值不会被重用。由于32位标识列的最大插入和删除限制为2 ^ 32(如果不包括负值,则限制为2 ^ 31),在此之后插入将导致溢出错误。从本质上讲,这是一种资源泄漏。我进行了一些计算,确定32位Identity列不能满足未来需求,甚至64位列也可能不够用,因为仅比台式机快1000倍的计算机就可以吞噬掉其中的值。不到一年。因此是128位GUID FTW。 (2认同)