如何在SQL Server中重置我的表的IDENTITY列?

时间:2017-09-29 07:36:53

标签: sql sql-server identity-column

如何重置已填充的表格中的IDENTITY列?

我试过这样的事情,但它不起作用

WITH TBL AS
(
    SELECT 
        *, 
        ROW_NUMBER() OVER(ORDER BY profile_id) AS RN
    FROM 
        Profiles
)
UPDATE TBL
SET profile_id = RN

错误:

  

无法更新标识栏' profile_id'。

enter image description here

2 个答案:

答案 0 :(得分:0)

据我所知,您无法更新标识列。 如果要保留标识(在更改其值之后),一种方法是创建另一个镜面表(相同的字段)并将所有数据传输到其中。 这样的事情(最后你会有一个带有新IDENTITY字段的表)。

原始表

CREATE TABLE TESTID (id iNT IDENTITY(1,1), DESCR VARCHAR(100), PROFILEID INT)
INSERT INTO TESTID VALUES ('bbbb', 888);
INSERT INTO TESTID VALUES ('Ccccc', 777);

新表

CREATE TABLE TESTID2 (id INT IDENTITY(1,1), DESCR VARCHAR(100), PROFILEID INT)

数据传输

SET IDENTITY_INSERT TESTID2 ON
INSERT INTO TESTID2 (ID, DESCR, PROFILEID)
SELECT 100+ROW_NUMBER() OVER (ORDER BY PROFILEID) AS RN, DESCR, PROFILEID FROM TESTID
 SET IDENTITY_INSERT TESTID2 OFF

测试

 INSERT INTO TESTID2 VALUES ('xxxx',999);
 SELECT * FROM TESTID;


id          DESCR              PROFILEID
----------- ----------------- -----------
101         Ccccc               777
102         bbbb                888
103         xxxx                999

如果需要,可以使用

更改身份起始值
DBCC checkident ('TESTID2', reseed, 4000)
INSERT INTO TESTID2 VALUES ('yyy',111)

id          DESCR                      PROFILEID
----------- -------------------------- -----------
101         Ccccc                      777
102         bbbb                       888
103         xxxx                       999
4001        yyy                        111

最后,删除原始表并重命名新表。

答案 1 :(得分:0)

使用DBCC命令“CHECKIDENT”可以重置表中列的标识值。

例如,Identity列的最后一个标识为100。如果我们希望下一行的标识为201,那么您可以使用以下DBCC命令 -

来实现此目的
DBCC CHECKIDENT (N'TableName', RESEED, 34);

如果标识列必须以下一个插入的标识1开头,那么该表应重新种植,标识为0.

但请记住,这样做可能会违反数据完整性,表记录的唯一性。