当IDENTITY列耗尽时该怎么办

时间:2013-04-25 15:42:20

标签: sql-server

如果您有现有数据,如何在SQL中重新设置标识列?有没有一种简单的方法来执行此操作,以便所有数据都获得更新的身份(这些都反映在关联外键上)?

编辑:如果达到身份栏的限制会怎样?在那种情况下你会做什么?这就是我问这个问题的原因。我只想了解如何解决这类问题。

3 个答案:

答案 0 :(得分:0)

无法自动执行此操作。您可以编写自己的一组脚本来完成此操作,但我不知道任何可以“压缩”现有标识范围的商业(MS或其他)解决方案。但是,正如Aaron所说,你为什么要首先这样做?

不保证SQL Server的标识值没有间隙甚至单调增长。有关详细信息,请查看http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/

如果您需要单调增长或持续增值,您可能需要开发自己的“价值提供者服务”。

答案 1 :(得分:0)

这是一个可能的HACK解决方案。

您是否使用原始IDENTITY定义从“0”开始。

你可以随意使用-MAX到-1。

DBCC CHECKIDENT ('MyTableName', RESEED, -2147483648);

但是,您可以使用应用程序代码(例如:DotNet)来检查“if myKey> 0”之类的内容。

如果你这样做了,我会放一个额外的CHECK约束,一旦表击中-1就会失败。

同样,我并不是真的建议。但提供它是可能的。

我曾几次使用过IDENTITY(自“旧时代”以来),我实际上是以-MAX值开始播种。

一个例子。一个没有FK的日志记录表。只是一个表来抛出一些每周刷新的审计数据,所以它实际上并不重要。 IDENTITY简单地给了它一些订单。

答案 2 :(得分:-1)

使用DBCC CHECKIDENT,您可以提供RESEED参数和new_reseed_value,如下例所示(来自MSDN链接):

USE AdventureWorks2012;
GO
DBCC CHECKIDENT ("Person.AddressType", RESEED, 10);
GO

与UPDATE和IDENTITY_INSERT结合使用以修改现有数据。