SQL重置已填充表中的标识ID

时间:2010-05-08 00:13:07

标签: sql identity-column

嘿所有。我的数据库中有一个表,里面有大约一千条记录。我想重置标识列,以便所有ID再次顺序。我在看this,但我认为它只适用于空桌

当前表

ID    |    Name
1           Joe
2           Phil
5           Jan
88          Rob

所需表

ID    |    Name
1           Joe
2           Phil
3           Jan
4           Rob

提前致谢

6 个答案:

答案 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)

快速解决方案是:

  1. 使用相同架构创建新表
  2. 将旧表复制到新表(标识列除外)
  3. 删除旧表
  4. 重命名新表

答案 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约束   插入操作将导致   重复的身份值。

  •