0

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

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

4

1 回答 1

0

在 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 返回当前标识值和标识列的当前最大值,无需重新设定种子。这些值通常(并且应该)相同。

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

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

WITH NO INFOMSGS 禁止所有信息性消息。

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

于 2012-09-16T17:54:10.523 回答