如何重置已填充的表格中的IDENTITY
列?
我试过这样的事情,但它不起作用
WITH TBL AS
(
SELECT
*,
ROW_NUMBER() OVER(ORDER BY profile_id) AS RN
FROM
Profiles
)
UPDATE TBL
SET profile_id = RN
错误:
无法更新标识栏' profile_id'。
答案 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.
但请记住,这样做可能会违反数据完整性,表记录的唯一性。