SQLite: столбец UPDATE из нескольких строк с последовательным значением - PullRequest
1 голос
/ 16 декабря 2011

У меня есть таблица со столбцами (int id pkey, int group, double sortOrder), где sortOrder реализует заданный пользователем порядок сортировки в одной группе.На некоторых модификациях мне нужно изменить нумерацию порядка сортировки всех элементов в группе.Значения SortOrder в разных группах не зависят друг от друга (т. Е. Сравниваются только в одной группе)

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

Дает мне все элементы в этой группе в текущем порядке, в которых мне нужно было бы назначитьпоследовательные значения (1, 2, 3, ...) для SortOrder.

Q: Есть ли какой-либо разумный способ - предпочтительно переносимый в другие реализации SQL - сделать это без обновления каждой строкив индивидуальном порядке?


Дополнительная информация: я использую double, потому что это позволяет тривиально назначать новый порядок сортировки без изменения других элементов (MIN-1 для ранее, MIN + 1 для вставки в конце и (A +B) / 2 для вставки между A и B.) - это, конечно, ограничено двойным разрешением (~ 52 вставки в худшем случае).Я еще не уверен, стоит ли это дополнительной проверки на переполнение, но у меня все равно будет такая же проблема с любым другим типом данных.

Единственная другая идея, которая мне пришла в голову, - это симуляция бесконечного разрешения с помощью строк и пользовательских функций COLLATE и ADD / SUB / AVG.Тем не менее, это кажется очень непереносимым.

1 Ответ

1 голос
/ 16 декабря 2011

Я не верю, что у 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

Я знаю, что вы сказали, что вы не хотите обновлять другие элементы каждый раз, но этот имеет , который на самом деле оказался довольно эффективным в большинстве случаев для меня в прошлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...