ID身份(1,1)列中的新值

时间:2014-02-21 14:20:02

标签: sql identity

最简单的例子:我有下表:

create table test
    ( ID int identity (1,1) not null primary key,
      text char(20) not null
    )

我已经创建了3个值:

  • (1,a)
  • (2,b)
  • (3,c)

现在我删除了(2,b),我的行是(1,a)(3,c)

  • 是否可以自动(1,a)(2,c)
  • 或者我必须创建一个程序吗?

1 个答案:

答案 0 :(得分:1)

不,你不应该。有太多方法可能会变坏 - 假设您在另一个表中有相关​​记录2作为外键 - 而不是孤立(并且很容易识别),它们将与另一个相关(不正确的)记录。

此外,IDENTITY通常用作聚簇索引(意味着它们决定了记录的物理存储位置)。如果您更改了该值,则必须对数据进行物理重新定位 - 不会伤害任何内容,但会导致不必要的I / O.

IDENTITY值不保证连续,它们保证唯一。如果您需要连续数字,最好的方法是通过添加ROW_NUMBER列在输出中导出数字:

SELECT 
    ROW_NUMBER() OVER (ORDER BY ID) RowNum,
    ID,
    text
FROM test

但请注意,如果中间的记录被删除(正如您猜测的那样)RowNum将是不同的。因此,您无法从该值构建任何关系 - 您只需使用它来显示连续订购