SQL Server:在不同的插入语句后更新主键



我想更新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

有人能指导我如何解决这个问题吗?

提前谢谢。

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

identity列提供了一个递增的数字序列,平衡了递增数字的目标与性能。因此,由于各种原因,尤其是由于deletes、失败的inserts以及并行环境中的性能优化,会出现间隙。

一般来说,无间隙数字的美学不如按键提供的功能重要,而且无间隙基本上不会对性能产生影响。

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

  • 页面上的数据需要为聚集索引重新排序。即使订单没有变化,情况也是如此
  • 如果为索引设置了级联更新,则必须更新外键
  • 如果您碰巧没有正确的外键定义,那么外键就会失效——这真的很糟糕

而且,即使您确实遇到了这样的麻烦,由于deletes、失败的inserts和数据库优化,将来也会出现缺口。

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

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

最新更新