SQL Server:在不同的insert语句之后更新主键

时间:2018-07-28 10:09:09

标签: sql sql-server database

我想更新SQL Server中的主键。我在表中执行了三个插入语句。主键列就是这样。

Id  NUM
-------
1   T1
2   T2
3   T3
7   T4
8   T5
9   T6
13  T7
14  T8
15  T9
16  T10

我要更新Id列以获取此信息:

Id  NUM
-------
1   T1
2   T2
3   T3
4   T4
5   T5
6   T6
7   T7
8   T8
9   T9
10  T10

有人可以指导我如何解决此问题吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

不要这样做!记住主键的用途。它们是非NULL键,用于唯一标识表中的每一行。它们有多种用途。特别是,它们用于外键引用。而且,在SQL Server中,它们(默认情况下)用于对原始数据进行排序。

identity列提供了一个递增的数字序列,平衡了递增数字与性能的目标。结果,出现间隙的原因多种多样,特别是由于delete,失败的insert和并行环境中的性能优化。

通常,无间隙数字的美学并不如按键提供的功能那么重要-间隙基本上对性能没有影响。

尤其是,更改主键可能会非常昂贵:

  • 页面上的数据需要针对聚簇索引进行重新排序。即使顺序没有变化,也是这样。
  • 如果为索引设置了级联更新,则必须更新外键。
  • 如果您碰巧没有正确的外键定义,则外键无效-这是一件很糟糕的事情。

而且,即使您遇到了麻烦,由于delete,失败的insert和数据库优化,将来也会出现差距。

答案 1 :(得分:0)

使用row_number()生成新序列。您需要通过NUM进行排序,忽略第一个字符T

UPDATE  t
SET     Id = rn
FROM
(
    SELECT  Id, NUM, 
            rn = row_number() OVER (ORDER BY convert(int, 
                                             substring(NUM, 2, len(NUM) - 1) ) )
    FROM    yourtable
) t