Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:在不同的insert语句之后更新主键_Sql_Sql Server_Database - Fatal编程技术网

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 有人能告诉我如何解决这个问

我想更新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
有人能告诉我如何解决这个问题吗

提前感谢。

使用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和数据库优化,将来也会出现差距