如何在SQL Server中重置表的标识列?

如何在SQL Server中重置表的标识列?,sql,sql-server,identity-column,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 错误: 无法更新标识列“配置文件\u id” 据我所知,您无法更新标识列。 如果要保留标识(更改其值后),一种方法是创建

如何在已填充的表中重置我的
IDENTITY

我试过这样的东西,但不起作用

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

无法更新标识列“配置文件\u id”


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

原始表格

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
试验

如果需要,可以使用更改标识起始值

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

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

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

原始表格

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
试验

如果需要,可以使用更改标识起始值

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
最后,删除原始表并重命名新表。

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

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

DBCC CHECKIDENT (N'TableName', RESEED, 34);
如果标识列在下一次插入时必须以标识1开头,则应将该表的标识重新设定为0

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

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

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

DBCC CHECKIDENT (N'TableName', RESEED, 34);
如果标识列在下一次插入时必须以标识1开头,则应将该表的标识重新设定为0



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

如果您的配置文件id是自动递增的,则无法更新它。如果您关心标识列中的数值,则可能是误用了它。将它们视为恰好适合数字列的不透明斑点,一切都将正常。假设/依赖于特定的值/顺序,你将陷入一个麻烦的世界。为什么你需要进行这样的重置?读取数据时,您始终可以使用
row_number
重新计算
id
值(选择)。如果这些是真实的客户电子邮件地址和电话号码,则不应在此处发布该图像。用一个不包括这些列的列替换它。@Tanner:true-但标题上写着“重置”,所以我想知道OP真正的意思是这两个列中的哪一个-因此我的评论。。如果您的配置文件id是自动递增的,那么您就不能更新它。如果您关心标识列中的数值,那么您可能误用了它。将它们视为恰好适合数字列的不透明斑点,一切都将正常。假设/依赖于特定的值/顺序,你将陷入一个麻烦的世界。为什么你需要进行这样的重置?读取数据时,您始终可以使用
row_number
重新计算
id
值(选择)。如果这些是真实的客户电子邮件地址和电话号码,则不应在此处发布该图像。将其替换为不包含这些列的问题。@Tanner:true-但标题上写着“重置”,所以我想知道OP的真正意思是这两个问题中的哪一个-因此我的评论..Tanner已经标记了一个重复的问题,其中一个答案提供了一种更简单的方法-创建一个新列而不是表。我不相信这应该是建议,因为它不太可能帮助OP或未来的访客。您没有考虑标识上可能存在的任何外键。我想说,在大多数数据库中,PK经常链接到一个或多个事物,在链接存在的地方这样做会失败。@Tanner这只是一个例子…@etsa-Yup,我理解。但是如果你同意这不是对现有答案的改进,你可以删除你的答案。@NisargShah你读过Tanner建议的答案了吗?这似乎并不相似。Tanner已经标记了一个重复的问题,其中一个答案提供了一种更简单的方法——创建一个新的列而不是表格。我认为这不应该是建议,因为它不太可能帮助OP或未来的访问者。您没有考虑标识上可能存在的任何外键。我想说,在大多数数据库中,PK经常链接到一个或多个事物,在链接存在的地方这样做会失败。@Tanner这只是一个例子…@etsa-Yup,我理解。但是如果你同意这不是对现有答案的改进,你可以删除你的答案。@NisargShah你读过Tanner建议的答案了吗?它似乎不相似。DBCC在未来的行中工作,但我的重点是重置现有行。如果我们希望下一行是
201
,为什么要设置
34
?DBCC在未来的行中工作,但我的重点是重置现有行。如果我们希望下一行是
201
,为什么要设置
34