重新排列sql server中的标识列值

时间:2011-04-27 14:13:15

标签: sql-server reset identity-column


请帮帮我!我有一个表将一个身份字段的值, 例如,1,2,4,6,8,10,1 ......等等。

我想按顺序制作它,即1,2,3,4,5,6,7 ......不使用drop

由于

5 个答案:

答案 0 :(得分:3)

你做不到。 identity列不可更新。 (或者至少你不能以任何理智的方式。你可以从表中删除所有行,然后用IDENTITY_INSERT重新插入它们)

identity列中的差距也只是生活中的一个事实,最好与之达成协议!如果您需要连续的数字序列用于显示目的,可以使用ROW_NUMBER

答案 1 :(得分:1)

为什么不创建新字段,从1开始创建标识种子,然后删除旧列并重命名新列(然后重新创建所有FK引用)。

答案 2 :(得分:1)

没有简单的方法可以做到这一点,没有理由你应该这样做。但是,您可以构建视图以提供类似的功能:

CREATE VIEW MyTableView AS SELECT ROW_NUMBER() OVER (ORDER BY Identity) AS RowNum, * FROM MyTable

然后让您的客户从MyTableView中选择。

如果您需要视图与表名相同,以确保向后兼容性,您当然可以重命名表,然后使用旧表名创建视图。

答案 3 :(得分:1)

我认为这是最佳解决方案..如果您喜欢,请尝试...

DECLARE @INC AS INTEGER 
SET @INC = 1 
WHILE (@INC <= 7582) --7582 is rowcount of table
BEGIN
    UPDATE YourTable
    SET    ID = @INC
    WHERE  ID = (
               SELECT MIN(ID) AS T
               FROM   YourTable
               WHERE  ID > @INC
           ) --ID=> Identity column
    SET @INC = @INC + 1
END 

注意:在执行之前,您需要将标识插入删除到列。

答案 4 :(得分:0)

DBCC CHECKIDENT(&lt;&#39;表名&#39;&gt;,RESEED,&lt;&#39;表**&#39;&gt;中的最后一个序列)

**这将使数字在输入时加1(+1)。即需要接下来的38为新记录,所以使用37作为这个值。