我有一张带有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
答案 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