我想更新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
有人可以指导我如何解决此问题吗?
谢谢。
答案 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