当前表
ID | Name
1 Joe
2 Phil
5 Jan
88 Rob
所需表
ID | Name
1 Joe
2 Phil
3 Jan
4 Rob
提前致谢
答案 0 :(得分:5)
最简单的方法是复制当前表,修复任何问题,删除它,然后重命名新表。
您也可以暂时删除IDENTITY
并尝试以下内容:
;WITH TBL AS
(
SELECT *, ROW_NUMBER(ORDER BY ID) AS RN
FROM CURRENT_TABLE
)
UPDATE TBL
SET ID = RN
或者,如果您不关心记录的顺序,那么
DECLARE INT @id;
SET @id = 0;
UPDATE CURRENT_TABLE
SET @id = ID = @id + 1;
答案 1 :(得分:3)
单向,将其包装在交易中
select id,name into #temp from YourTable
truncate table YourTable
insert YourTable (name)
select name from #temp
答案 2 :(得分:1)
快速解决方案是:
答案 3 :(得分:1)
因为你在同一个表中有外键(根据你的评论),你需要保留从旧到新的映射,并重新设置外键以匹配新的身份。
有很多方法可以做到这一点,但我强烈质疑是否需要更新主键,特别是因为你已经有外键引用它们,而且它只是一个代理键。这并不是说您将代理键更改为GUID或特殊内容。
答案 4 :(得分:1)
以下是我重置身份字段的方法。上面的CTE(通用表格表达)是过度的。只需使用当前的行号来使用带有连接的简单更新语句来更新标识列:
UPDATE [YourTable] SET ID = rn.RowNumber FROM [YourTable]
JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber
FROM [YourTable]) rn ON rn.ID = [YourTable].ID
此声明可能会被重构为更简单。如果是这样,我希望看到更简单的版本。
我希望这有助于某人。
答案 5 :(得分:-1)
使用DBCC CHECKIDENT。该表不需要为空:
DBCC CHECKIDENT ( table_name, NORESEED)
不重置当前标识值。 DBCC CHECKIDENT返回当前值 身份价值和当前最大值 标识列的值。如果 两个值不一样,你 应该将身份值重置为 避免潜在的错误或差距 价值序列。
DBCC CHECKIDENT ( table_name )
或DBCC CHECKIDENT ( table_name, RESEED )
如果当前的标识值为 表小于最大值 身份值存储在身份中 列,使用最大值重置 身份栏中的值。
DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )
当前标识值设置为 new_reseed_value。如果没有行 自从插入表中 表已创建,或者所有行都已创建 已使用TRUNCATE删除 TABLE语句,第一行 运行DBCC CHECKIDENT后插入 使用new_reseed_value作为标识。 否则,插入的下一行使用 new_reseed_value +当前 增量值。
如果表格不为空,请设置 身份价值低于数字 身份中的最大值 列可以导致其中一个 以下条件:
如果标识上存在PRIMARY KEY或UNIQUE约束 列,错误消息2627将 在以后的插入操作中生成 因为生成了进入表 身份价值会与之发生冲突 现有价值观。
如果以后不存在PRIMARY KEY或UNIQUE约束 插入操作将导致 重复的身份值。