перемешивать значения в целочисленном столбце, чтобы они всегда были уникальными и последовательными - PullRequest
1 голос
/ 10 августа 2010

У меня есть таблица, которую я хочу отсортировать по столбцу «приоритет». Этот столбец необходимо изменить при изменении приоритета записи или удалении записей. Думайте об этом как массив. Значения будут изменены в пользовательском интерфейсе, поэтому я хочу, чтобы они оставались целыми числами и представляли истинную позицию в большем наборе записей. Столбец приоритета не будет иметь значения NULL.

id       priority
1        2
2        1
3        4
4        3

Теперь скажите, что я изменяю приоритет идентификатора 4 на 2, или я вставляю или удаляю строку, как получить все приоритеты для перестановки, чтобы не было пробелов или дубликатов, а наивысший возможный приоритет всегда равен числу строк? *

Таблица имеет поле "date_modified", которое с точностью до секунды и обновляется при вставке / обновлении, поэтому при необходимости можно узнать, какая запись была изменена последней (чтобы разорвать связь, когда 2 записи имеют одинаковый приоритет)

Ответы [ 2 ]

1 голос
/ 10 августа 2010

Если у вас есть 8.4, вы можете использовать оконные функции.

UPDATE test_priority 
SET priority = sub.new_priority
FROM (
    SELECT user_id, id, priority, rank() OVER (ORDER BY priority, date_modified) new_priority
    FROM test_priority
    WHERE user_id = $1
) sub 
WHERE test_priority.user_id = sub.user_id 
  AND test_priority.id = sub.id
  AND test_priority.priority <> sub.new_priority
0 голосов
/ 10 августа 2010

Удаление строки:

UPDATE tbl SET priority = priority - 1 
WHERE priority > the_priority_of_what_you_deleted

Вставка строки (выполните перед вставкой):

UPDATE tbl SET priority = priority + 1 
WHERE priority >= the_priority_about_to_be_inserted

Вы можете поместить эту логику в триггеры INSERT и / или DELETE, если хотите.

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