【问题标题】:Changing Identity Seed in SQL Server (Permanently!)在 SQL Server 中更改身份种子(永久!)
【发布时间】:2011-01-09 12:44:16
【问题描述】:

有没有办法永久更改身份列的身份种子?使用 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

会存在。

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

【问题讨论】:

  • 运行 Profiler,我看到 MS 创建了一个临时表,复制数据,然后删除现有表并重命名临时表。可能是因为身份列不能超过一个。

标签: sql-server seed identity-column


【解决方案1】:

来自在线书籍:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 并且甚至不要考虑对一张大桌子这样做!
    • 我通常建议不要在企业管理器中编辑任何生产表。有时它会复制、删除和粘贴您的表格以完成所需的操作。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 只是重申问题,不提供答案。
      猜你喜欢
      • 2019-04-29
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多