【问题标题】:SQLite: UPDATE column of multiple rows with sequential valueSQLite:更新具有顺序值的多行列
【发布时间】:2011-12-16 16:21:56
【问题描述】:

我有一个表,其中包含 (int id pkey, int group, double sortOrder) 列,其中 sortOrder 在一个组中实现用户指定的排序顺序。在一些修改中,我需要重新编号组中所有项目的排序顺序。不同组中的 SortOrder 值彼此独立(即它们只在一个组内进行比较)

SELECT id, sortOrder FROM tbl WHERE group=X ORDER BY SortOrder

以当前顺序为我提供该组中的所有元素,我必须将顺序值 (1, 2, 3, ...) 分配给 SortOrder。

问:是否有任何合理的方法(最好可移植到其他 SQL 实现)而不单独更新每一行?


更多信息:我正在使用双打,因为这允许在不修改其他项目的情况下轻松分配新的排序顺序(MIN-1 用于之前,MIN+1 用于插入末尾,以及 (A+B)/2 用于插入在 A 和 B 之间。) - 这当然受到双分辨率的限制(在最坏的情况下约 52 次插入)。我还不确定这是否值得额外检查溢出,但无论如何我都会遇到任何其他数据类型的相同问题。

我想出的唯一其他想法是使用字符串和自定义 COLLATE 和 ADD/SUB/AVG 函数来模拟无限分辨率。但是,这似乎非常不便携。

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    我不相信 SQLite 有这么简单的方法。

    您可能会更好地了解(如果这确实是一个问题)是坚持整数排序并实现维护序列的算法。

    例如,如果对排序的所有更改都涉及将项目向上/向下移动一个位置,则只需交换两个值的排序顺序...

    UPDATE table
    SET sort_order = CASE WHEN sort_order = 3 THEN 4 ELSE 3 END
    WHERE sort_order IN (3,4)
    

    或者,如果您可以将项目移动到任何位置,请使用类似...

    UPDATE table
    SET sort_order = CASE WHEN sort_order = @old THEN @new ELSE sort_order + 1
    WHERE sort_order >= @new AND sort_order <= @old
    

    我知道你说过你不想每次都更新其他项目,但是这个已经实际上被证明在中非常有效过去对我来说大多数情况

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多