如何在存在现有数据时在SQL中重新标识SQL中的标识列?是否有一种简单的方法来执行此操作,以便所有数据都可以获得更新的身份(这些身份也反映在关联外键上)?当IDENTITY列已用尽时该怎么办
编辑:如果达到您的身份列的限制会发生什么?在这种情况下你会做什么?那为什么我问这个问题。我只想了解这种问题如何解决。
如何在存在现有数据时在SQL中重新标识SQL中的标识列?是否有一种简单的方法来执行此操作,以便所有数据都可以获得更新的身份(这些身份也反映在关联外键上)?当IDENTITY列已用尽时该怎么办
编辑:如果达到您的身份列的限制会发生什么?在这种情况下你会做什么?那为什么我问这个问题。我只想了解这种问题如何解决。
没有办法自动做到这一点。你可以写你自己的一套脚本来完成这件事,但我不知道任何商业(MS或其他)解决方案,“压缩”现有的身份范围。但是,正如亚伦所说的那样,为什么你要这样做呢?
SQL Server的身份值不保证没有空白或甚至单调增长。更多详情请查看http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/
如果你需要你的价值观单调增长或持续增长,你可能需要开发自己的“价值提供者服务”。
通过使用DBCC CHECKIDENT,可以提供RESEED
参数和new_reseed_value
如在下面的例子中(从MSDN链路):
USE AdventureWorks2012;
GO
DBCC CHECKIDENT ("Person.AddressType", RESEED, 10);
GO
结合与UPDATE和IDENTITY_INSERT修改现有数据。
OP要求改变现有标识值的方法,而不是下一个。 – 2013-04-25 15:51:55
您需要修改现有的和未来的身份以使其可以正常工作,特别是在您增加价值的情况下。 – Widor 2013-04-25 15:55:57
这是一个可能的HACK解决方案。
你是否从原始IDENTITY定义的“0”开始。
你有一个完整的-MAX到-1在你的处置。
DBCC CHECKIDENT ('MyTableName', RESEED, -2147483648);
,但你可以有应用程序代码:用于检查之类的东西(如DOTNET的) “如果的myKey> 0”,将bl0w起来。
如果你这样做了,我会放一个额外的CHECK约束,一旦表命中-1就会失败。
再一次,我没有真正建议。但提供它作为一种可能性。
有几次我使用了IDENTITY(自“旧日”以来),我实际上是以-MAX值开始播种。
一个例子。一个没有FK的日志表。只需要一张表格来投掷一些每周都会被刷新的审计数据,所以这实际上并不重要。身份只是给了它一些命令。
有什么用途?如果是因为你不喜欢差距或大数字,那么*停止使用IDENTITY *。 – 2013-04-25 15:43:07
这很混乱。所有表格中是否有唯一的约束(与IDENTITY无关)? – granadaCoder 2013-04-25 15:47:37
但是,只是因为“你可能会把它拉掉”..........并不意味着它是一个好主意。 – granadaCoder 2013-04-25 15:48:01