SQL Server:在不同的insert语句之后更新主键
我想更新SQL Server中的主键。我在表中执行了三条insert语句。主键列是这样的SQL Server:在不同的insert语句之后更新主键,sql,sql-server,database,Sql,Sql Server,Database,我想更新SQL Server中的主键。我在表中执行了三条insert语句。主键列是这样的 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 有人能告诉我如何解决这个问
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
有人能告诉我如何解决这个问题吗
提前感谢。使用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
别这样!记住主键的用途。它们是唯一标识表中每一行的非
NULL
键。它们有多种用途。特别是,它们用于外键引用。在SQL Server中,它们(默认情况下)用于对原始数据进行排序
identity
列提供了一个不断增加的数字序列,平衡了增加数字的目标和性能。因此,出现差距的原因多种多样,特别是由于并行环境中的delete
s、插入失败insert
s和性能优化
一般来说,无间隙数字的美感不如键提供的功能重要,而且间隙基本上不会影响性能
特别是,更改主键可能会非常昂贵:
- 页面上的数据需要为聚集索引重新排序。即使在顺序不变的情况下也是如此
- 如果为索引设置了级联更新,则必须更新外键
- 如果您碰巧没有正确的外键定义,外键将失效——这是一件非常糟糕的事情
delete
s、失败的insert
s和数据库优化,将来也会出现差距