gpt4 book ai didi

sql-server - 在两个连续行之间插入记录的最佳方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:39 24 4
gpt4 key购买 nike

我有一个简单的顺序表:

  ID   | Name | Rank
=======+======+=====
327 | Ali | 1
-------+------+-----
846 | Sara | 2
-------+------+-----
657 | Dani | 3
-------+------+-----
...

ID 是主键和索引,Rank 也是索引。我有几条这样的记录,我想要的是在 SQL Server 中该表的记录之间插入一条记录,以保持其顺序而不破坏排名。

例如,我将 Sahar 插入到排名为 2 的上表中,这会导致更高的排名,所以:

  ID   | Name | Rank
=======+======+=====
327 | Ali | 1
-------+------+-----
196 | Sahar| 2 ----> Inserted
-------+------+-----
846 | Sara | 3
-------+------+-----
657 | Dani | 4
-------+------+-----
...

我已经搜索过,并且找到了一些解决方案,例如:

UPDATE TABLE table SET Rank += 1 WHERE Rank >= 2;
INSERT INTO TABLE (Rank, ...) VALUES (2, ...);

在此answer ,或者另一种方法可能是 this answer .和我找到的其他一些答案,但所有这些答案的运营成本都很高。

我可能还需要更改一些 Ranks 或交换两个 Ranks

另一方面,我必须在 UPDATEDeleteInsert Triggers 中执行此操作,否则-曾经你推荐过。

  1. 是否有identity(1,1)或其他内置机制SQL Server 中的服务旨在解决此问题?
  2. 如果不是,那么在性能方面最好的方法是什么 操作?(答案应该有一个很好的解释 实现地点(触发器或...),索引问题,也可能 需要更改我的表定义)

谢谢。

最佳答案

如果你的表有N带有 Rank 的行来自 1N , 然后插入新行 Rank=2 , 那么你必须 UPDATE (即更改)N-2 中的值行。您将不得不对表进行大量更改。恐怕没有什么神奇的方法可以加快速度。

如果你真的必须更新 Rank , 即。

但是,也许您真的不需要 Rank作为一个没有间隙的整数。

Rank 的真正目的是定义一定的行顺序。要定义顺序,您需要知道每一行之后是哪一行。所以,当用户说他想添加 Sahar与排名2这真的意味着 Sahar应该去 Ali , 但在 Sara 之前,因此新行的排名可以设置为,比方说,(1+2)/2 = 1.5 .

所以,如果你制作 Rank一个 float ,您将能够在表格中间插入新行而不更改 Rank 的值所有其他行。

如果要出示Rank作为一个没有间隙的整数序列向用户使用类似的东西:

ROW_NUMBER() OVER(ORDER BY FloatRank) AS IntegerRankWithoutGaps

此外,如果删除一行,也不需要更新表的所有行。坚持FloatRank值会有差距,但当 ROW_NUMBER 时它会消失已应用。

从技术上讲,您不能无限期地将一个 8 字节的浮点间隔一分为二,因此您应该偶尔运行一个维护过程来“规范化”您的浮点等级并更新表中的所有行。但是,至少这个昂贵的过程可以不经常运行并且在系统负载最小的时候运行。

此外,您可以从浮点值开始,而不是 1 ,但距离更远。例如,而不是 1, 2, 3, 4...1000, 2000, 3000, 4000, ... 开始.

关于sql-server - 在两个连续行之间插入记录的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31901318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com