Sql 重新分配移动操作序号的最佳方法是什么

Sql 重新分配移动操作序号的最佳方法是什么,sql,algorithm,Sql,Algorithm,我在sql server中有一个名为“Ordinal”的列,用于指示行的显示顺序。它从0开始,下一行跳过10。所以我们有这样的东西: Id Ordinal 1 0 2 20 3 10 它跳过了10,因为我们希望能够在项目之间移动项目(基于序号),而不必为整个表重新分配序号 正如您最终可以想象的那样,由于目标项之间未使用的序号都已用完,因此需要以某种方式重新分配序号,以便在周围行或整个表上执行“中间移动”操作 考虑到表的长期可维护性和最小化表的更新操作,是否有任何算法可用于有

我在sql server中有一个名为“Ordinal”的列,用于指示行的显示顺序。它从0开始,下一行跳过10。所以我们有这样的东西:

Id  Ordinal
1    0
2    20
3    10
它跳过了10,因为我们希望能够在项目之间移动项目(基于序号),而不必为整个表重新分配序号

正如您最终可以想象的那样,由于目标项之间未使用的序号都已用完,因此需要以某种方式重新分配序号,以便在周围行或整个表上执行“中间移动”操作


考虑到表的长期可维护性和最小化表的更新操作,是否有任何算法可用于有效地重新排列移动操作的序号

这些并不能直接回答您的问题——我只是想建议一些其他方法:

一种可能性——不要试图用手来做。让你的软件管理数字。如果他们需要重写,只需用新的数字保存即可


第二,使用“链表”代替。在每个记录中,存储要显示的下一条记录的索引,然后将代码直接加载到链表中。

您可以使用稍微复杂的
UPDATE
语句对序列重新编号:

UPDATE u
SET u.sequence = 10 * (c.num_below-1)
FROM test u
JOIN (
  SELECT t.id, count(*) AS num_below
  FROM test t
  JOIN test tr ON tr.sequence <= t.sequence
  GROUP BY t.id
) c ON c.id=u.id
更新后的
测试内容

ID  Sequence
__  ________
 1   0
 2  10
 3  20
 4  12
ID  Sequence
__  ________
 1   0
 2  30
 3  10
 4  20
现在序列号均匀分布,所以可以继续插入中间直到新的序列号用完为止;然后你可以重新编号


又是一种简单的方法。假设您正在插入一条新记录,其序号等于
x

首先,检查是否有一行的
ordinal
值等于
x
。如果有,只需更新所有
ordinal
值等于或大于
x
的记录,并将其增加
y
。然后,您可以安全地插入新记录


通过这种方式,您可以确保不会每次都运行
update
,当然,您将遵守订单

我认为这是最好的答案。您的方法可能需要在整个应用程序的生命周期内进行最少的重新排序,因为它会再次均匀地分布所有行。谢谢