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:更新具有顺序值的多行列的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite的多表连接更新

使用 SQLite 的 sqlite-net-pcl 库更新单行表中单个列的值的简单方法是啥?

具有不同主键值的 SQLite 连接表

Sqlite3 从列中具有相似值的行获取数据

SQLITE3 - 删除具有相同值的多个列的行

在 sqlite 查询中如何获取具有所需值的特定行和列