我想更新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
列提供了一个递增的数字序列,平衡了递增数字的目标与性能。因此,由于各种原因,尤其是由于delete
s、失败的insert
s以及并行环境中的性能优化,会出现间隙。
一般来说,无间隙数字的美学不如按键提供的功能重要,而且无间隙基本上不会对性能产生影响。
尤其是,更改主键可能非常昂贵:
- 页面上的数据需要为聚集索引重新排序。即使订单没有变化,情况也是如此
- 如果为索引设置了级联更新,则必须更新外键
- 如果您碰巧没有正确的外键定义,那么外键就会失效——这真的很糟糕
而且,即使您确实遇到了这样的麻烦,由于delete
s、失败的insert
s和数据库优化,将来也会出现缺口。
使用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