在SQL Server中永久更改标识种子(Identity Seed)!

13

如何永久更改标识列的标识种子?使用DBCC CHECKIDENT似乎只会设置最后一个值。如果截断表格,则所有值都将被重置。

dbcc checkident ('__Test_SeedIdent', reseed, 1000)

select name, seed_value, increment_value, last_value
from sys.identity_columns
where [object_id] = OBJECT_ID('__Test_SeedIdent');
返回结果
name      seed_value  increment_value  last_value
-------------------------------------------------
idIdent   1           1                1000
我曾希望有一些类似于语法的东西。
alter table dbo.__Test_SeedIdent alter column idIdent [int] identity(1000,1) NOT NULL
需要创建新列,将值移到新列,删除原始列并重命名新列吗?

运行分析器,我看到 MS 创建了一个临时表,将数据复制到该表中,然后删除现有表并重命名临时表。可能是因为不能有多个标识列。 - avenmore
4个回答

16

从Books Online中:

"要更改原始种子值并重新设置任何现有行的种子值,必须删除标识列并重新创建它,指定新的种子值。当表包含数据时,标识数字将添加到具有指定种子和增量值的现有行中。不保证更新行的顺序。"


3

MSSQL不允许您通过TSQL轻松地向现有列添加或更改Identity。 您必须删除该列并重新添加它。 不用说,这可能会对FK关系造成影响。 您可以直接在企业管理器中完成此操作。 但是,如果您需要对很多列执行此操作,则不会很有趣。

是否需要创建新列,移动值,删除原始列并重命名新列?

是的,并且不要忘记修复/更新与该列相关联的所有索引、外键关系等。


别想着对大表这么做! - HLGEM
我通常建议不要在企业管理器中编辑任何生产表。有时它会复制、删除和粘贴您的表以完成所需的操作。 - Russell Steen

1
你可以使用DBCC CHECKIDENT('tablename', RESEED, seedvalue) 例如:DBCC CHECKIDENT('Customers',RESEED, 1350) 运行DBCC CHECKIDENT('Customers') 来检查当前种子值是否被设置。
然而,正如之前的答案中提到的,这不会改变存储在标识列中的现有值。它只会改变种子值,使下一个插入的行从该值开始。标识增量保持不变(未更改),无法通过DBCC更改。

1
只是重新陈述了问题,没有提供答案。 - avenmore

0
“需要创建一个新列,移动值,删除原始列并重命名新列吗?” 实际上,在企业管理器中,当您向现有表添加ID列(或将INT PK字段更改为INT PK ID)时,它会在后台执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接