Sql server 2008 在SQL Server 2008中向下移动标识列值

Sql server 2008 在SQL Server 2008中向下移动标识列值,sql-server-2008,Sql Server 2008,我对这种结构的桌子有问题 ID Name Code ------------------- 2 Counter 1 1001 3 Counter 2 1002 4 Counter 3 1003 Id是一个identity列,是表的主键 现在我想更改并将id上移到以下格式: ID Name Code -------------------- 1 Counter 1 1001 2 Counter 2 1002 3 Counter 3

我对这种结构的桌子有问题

ID  Name       Code
-------------------
2   Counter 1  1001
3   Counter 2  1002
4   Counter 3  1003
Id
是一个
identity
列,是表的主键

现在我想更改并将id上移到以下格式:

ID  Name       Code
--------------------
1   Counter 1  1001
2   Counter 2  1002
3   Counter 3  1003
用户数据非常重要,不能更改


非常感谢

我完全同意@Damien\u这个不信者的观点。但是,如果您仍然要移动这些值,请尝试下面的脚本

     SET IDENTITY_INSERT tablename ON;

    ;WITH CTE AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) NewID
        FROM TableName
    )
    UPDATE CTE 
    SET ID = NewID

    SET IDENTITY_INSERT tablename OFF; 

    DECLARE @SeedValue INT = (SELECT COUNT(*) FROM TableName);

    DBCC CHECKIDENT ("TableName", RESEED, @SeedValue);
    GO

DBCC CHECKIDENT会将标识种子值重置为表中的总行数,因此下次插入新行时,它会为标识列生成下一个连续值。

如果您关心标识列中的实际数值,则使用错误。您应该将它们视为纯粹的系统生成的blob,恰好适合数字列并唯一地标识行——这是它们的工作,而不是其他任何工作。它们不应该对用户真正可见,因此实际值根本不重要。更改键很少是一个好主意,因为来自其他表的任何引用都可能会中断。相反,您应该编写查询,使其不计算连续的数字,而只计算唯一的数字。因为一旦设置了标识列,您就无法更改/更新该列的值,因此您唯一的选择是创建具有相同结构的新表并复制数据,为
INSERT
中的
ID
列提供新值。看起来需要做大量的工作-到底是为了什么目的??
Msg 8102,16级,状态1,第3行无法更新标识列“ID”。
。即使是
IDENTITY\u INSERT
在这里也帮不了你。亲爱的nithin非常感谢,但是我在SET ID=NewID上遇到了一个问题。我在这一行中遇到了一个错误,“无效列名”,然后使用“SET IDENTITY\u INSERT tablename off”关闭标识列,更新部分完成后,使用“SET IDENTITY\u INSERT tablename ON”再次启用它。我已经更新了查询,看一下。