填补IDENTITY列值的空白

时间:2011-01-04 18:46:30

标签: sql sql-server

我有一张带有IDENTITY列的表

[Id] int IDENTITY(1, 1) NOT NULL

在添加/删除某些行后,我以Id值中的间隙结束:

Id   Name
---------
1    Tom
2    Bill
4    Kate

是否有一种简单的方法可以将值压缩为

Id   Name
---------
1    Tom
2    Bill
3    Kate

4 个答案:

答案 0 :(得分:9)

我强烈建议您保留身份值。

如果此ID列用作另一个表上的外键,更改它们会很快变得复杂。

如果某些业务逻辑必须是顺序的,那么添加一个新列ID_Display,您可以使用ROW_NUMBER()更新它们,并为最终用户保留它们。我从不让最终用户看到和/或指示我如何创建/填充/存储数据,如果他们打扰你的ID,那么向他们展示一些看起来像ID但不是FK或PK的其他数据。

答案 1 :(得分:3)

我认为使用相同的模式创建第二个表非常容易,从第一个表导入所有数据(当然除了标识列;让第二个表开始重新编号),删除第一个表并重命名第2个原始名称。

如果你有大量的FK关系可以与其他桌子等重建,那么容易可能会有问题。

答案 2 :(得分:1)

据我所知,唯一可行的方法是通过打开标识插入来手动更新值。但是你应该首先避免在第一时间输入这样的东西..如果你截断表格它也不会有那些差距。

答案 3 :(得分:1)

  

我无法控制需要ID列的部分。

这听起来似乎有程序逻辑假定没有间隙 - 正确吗?

  

我需要这个以保持两个不同的数据库同步。

目前还不清楚你的意思。如果IDENTITY列中的实际值没有意义(不被其他表用作外键),您可以这样做:

DELETE FROM db1.table
SELECT col1, col2, col3 /* leave out the IDENTITY column */ 
INTO db1.table FROM db2.table