-1

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

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

4

3 回答 3

0

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

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

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

于 2013-04-25T15:51:12.073 回答
0

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

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

你有一个完整的 -MAX 到 -1 供你使用。

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

但是,您可以使用应用程序代码(例如:DotNet)来检查诸如“if myKey>0”之类的事情,这会导致崩溃。

如果你这样做了,我会添加一个额外的 CHECK 约束,一旦表达到 -1,它就会失败。

再说一次,我真的不建议这样做。但提供它作为一种可能性。

我使用 IDENTITY 的几次(从“旧时代”开始),实际上是从 -MAX 值开始播种。

一个例子。一个在其下没有 FK 的日志记录表。只是一个表格,用于抛出一些每周刷新的审计数据,所以这实际上并不重要。IDENTITY 只是给了它一些命令。

于 2013-04-25T17:14:31.433 回答
-1

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

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

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

于 2013-04-25T15:50:25.963 回答