如何在SQL Server 2008中重新组织标识列值

时间:2012-09-16 17:41:35

标签: sql sql-server replication identity

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

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

1 个答案:

答案 0 :(得分:0)

在Management Studio中创建标识列时生成标识列。

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

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

在代码中,datatype是一个数字列。种子和增量都是可选的,两者的默认值都是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总是递增种子值。

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

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