13

有没有办法永久更改身份列的身份种子?使用 DBCC CHECKIDENT 似乎只是设置了 last_value。如果表被截断,所有值都会被重置。

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

会存在。

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

4

4 回答 4

16

来自在线书籍:

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

于 2010-01-26T14:43:29.113 回答
3

MSSQL 不允许您很容易地通过 TSQL 在现有列上添加或更改标识。您必须删除该列并重新添加它。不用说,这会与 FK 关系打得很糟糕。您可以直接在企业管理器中执行此操作。但是,如果您必须对很多列执行此操作,那将不会很有趣。

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

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

于 2010-01-26T13:52:08.670 回答
0

“是否有必要创建一个新列,移动值,删除原始列并重命名新列?”

实际上,在 Enterprise Manager 中,当您将 ID 列添加到现有表(或将 INT PK 字段更改为 INT PK ID)时,它会在后台执行此操作。

于 2010-01-26T14:34:06.603 回答
0

您可以使用DBCC CHECKIDENT('tablename', RESEED, seedvalue)

示例:再次DBCC CHECKIDENT('Customers',RESEED, 1350) 运行DBCC CHECKIDENT('Customers')以检查是否设置了当前种子值。

但是,如前面的答案中所述,这不会更改存储在标识列中的现有值。它只会更改种子值,因此插入的下一行将从该值开始。身份增量保持不变(未更改)并且不能使用 DBCC 更改。

于 2019-07-19T16:31:22.720 回答