【问题标题】:How to Reorganize Identity Column Values in SQL Server 2008如何在 SQL Server 2008 中重新组织标识列值
【发布时间】:2012-09-16 17:41:35
【问题描述】:

我有一个 SQL Server 数据库设置为复制环境中的发布者。它有几个订阅,几个不同的人一直在对这些执行INSERT 语句。由于为标识列分配的值范围不同,一旦将所有数据推回发布,我们最终会得到非常大的变化。

这在生产环境中当然是可以预料的,甚至是可取的。但是,我们仍在开发中,因此希望重新组织所有身份值,以便它们是连续的。我们想要[1,2,3,4,5,6] 而不是[1,2,3,1001,1001,1003]。我意识到这意味着更改标识列值并在它们支持的关系中相应地更新它们。有可能做这样的事情吗?

【问题讨论】:

标签: sql sql-server replication identity


【解决方案1】:

在 Management Studio 中创建身份列时为其设置种子。

如果您使用代码创建表,您可以使用以下形式的 Transact-SQL (T-SQL) CREATE TABLE 语句轻松地为表的标识列设定种子:

CREATE TABLE tablename 
(
  columnname datatype identity [(seed, increment)
  [NOT FOR REPLICATION]],
  [columnname ...]
)

在代码中,数据类型是数值列。种子和增量都是可选的,两者的默认值都是 1。

图 B 显示了使用 CREATE TABLE 创建名为 Orders 的表并将 OrderID 列的标识种子和增量值分别设置为 100 和 10 的结果。如您所见,第一个标识值为 100,随后的每个值增加 10。(您可以通过为增量指定负值来减小标识值。)

并使用 CREATE TABLE 为标识列设置种子。

检查和重新播种

例如,如果您将表的所有记录复制到存档表中,然后删除源表中的所有记录,您可能希望重新设定源表的标识列的种子,以便控制顺序。如下使用 T-SQL 的 DBCC CHECKIDENT 重新设定标识列的种子:

DBCC CHECKIDENT    
(    
  tablename    
  [, [NORESEED | RESEED [, newreseedvalue]]]    
)

[WITH NO_INFOMSGS]

表 A 定义了该语句的可选参数。

表 A:DBCC CHECKIDENT

参数

说明

NORESEED 返回当前标识值和标识列的当前最大值,无需重新设定种子。这些值通常(并且应该)相同。

重新种子 如果当前标识值小于标识列中存储的最大标识值,则使用标识列中的最大值更改当前标识值。

新种子值 重新设定种子时指定新的种子值。如果表为空,则第一个标识值(在执行 DBCC CHECKIDENT 之后)将等于 newreseedvalue。如果表包含数据,则下一个标识值将等于 newreseedvalue + 当前增量值(默认值为 1)。此行为是 SQL Server 2005 的新行为(并且在 2008 中仍然存在)。 SQL Server 2000 总是递增种子值。

没有信息 禁止所有信息性消息。

从技术上讲,DBCC CHECKIDENT 检查并更正标识值。简单地说,使用它来学习当前的标识值或重新设置现有标识列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2013-10-09
    • 1970-01-01
    • 2010-10-14
    • 2011-04-01
    相关资源
    最近更新 更多