SQLite:更新具有顺序值的多行列
Posted
技术标签:
【中文标题】SQLite:更新具有顺序值的多行列【英文标题】:SQLite: UPDATE column of multiple rows with sequential value 【发布时间】: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 函数来模拟无限分辨率。但是,这似乎非常不便携。
【问题讨论】:
【参考方案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
我知道你说过你不想每次都更新其他项目,但是这个已经实际上被证明在中非常有效过去对我来说大多数情况。
【讨论】:
以上是关于SQLite:更新具有顺序值的多行列的主要内容,如果未能解决你的问题,请参考以下文章