如果您有现有数据,如何在SQL中重新设置标识列?有没有一种简单的方法来执行此操作,以便所有数据都获得更新的身份(这些都反映在关联外键上)?
编辑:如果达到身份栏的限制会怎样?在那种情况下你会做什么?这就是我问这个问题的原因。我只想了解如何解决这类问题。
答案 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结合使用以修改现有数据。