2013-04-25 31 views
-1

如何在存在现有数据时在SQL中重新标识SQL中的标识列?是否有一种简单的方法来执行此操作,以便所有数据都可以获得更新的身份(这些身份也反映在关联外键上)?当IDENTITY列已用尽时该怎么办

编辑:如果达到您的身份列的限制会发生什么?在这种情况下你会做什么?那为什么我问这个问题。我只想了解这种问题如何解决。

+2

有什么用途?如果是因为你不喜欢差距或大数字,那么*停止使用IDENTITY *。 – 2013-04-25 15:43:07

+0

这很混乱。所有表格中是否有唯一的约束(与IDENTITY无关)? – granadaCoder 2013-04-25 15:47:37

+0

但是,只是因为“你可能会把它拉掉”..........并不意味着它是一个好主意。 – granadaCoder 2013-04-25 15:48:01

回答

0

没有办法自动做到这一点。你可以写你自己的一套脚本来完成这件事,但我不知道任何商业(MS或其他)解决方案,“压缩”现有的身份范围。但是,正如亚伦所说的那样,为什么你要这样做呢?

SQL Server的身份值不保证没有空白或甚至单调增长。更多详情请查看http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/

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

-1

通过使用DBCC CHECKIDENT,可以提供RESEED参数和new_reseed_value如在下面的例子中(从MSDN链路):

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

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

+2

OP要求改变现有标识值的方法,而不是下一个。 – 2013-04-25 15:51:55

+0

您需要修改现有的和未来的身份以使其可以正常工作,特别是在您增加价值的情况下。 – Widor 2013-04-25 15:55:57

0

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

你是否从原始IDENTITY定义的“0”开始。

你有一个完整的-MAX到-1在你的处置。

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

,但你可以有应用程序代码:用于检查之类的东西(如DOTNET的) “如果的myKey> 0”,将bl0w起来。

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

再一次,我没有真正建议。但提供它作为一种可能性。

有几次我使用了IDENTITY(自“旧日”以来),我实际上是以-MAX值开始播种。

一个例子。一个没有FK的日志表。只需要一张表格来投掷一些每周都会被刷新的审计数据,所以这实际上并不重要。身份只是给了它一些命令。