在整数列中随机播放值,因此它们始终是唯一且顺序的

时间:2010-08-10 14:31:38

标签: sql postgresql

我有一个表,我想用“优先级”列排序。更改记录的优先级或删除记录时,需要重新排序此列。把它想象成一个数组。这些值将在UI中进行修改,因此我希望它们保持整数并表示较大记录集中的真实位置。优先级列不会有NULL。

id       priority
1        2
2        1
3        4
4        3

现在说我将id 4的优先级更改为2,或者我插入或删除一行,如何让所有优先级重新洗牌,以便没有间隙或重复,最高优先级始终是行数?

该表有一个“date_modified”字段,该字段对第二个字符是准确的,并在插入/更新时更新,因此如果需要,可以知道最后修改了哪条记录(当2条记录具有相同的优先级时打破平局)< / p>

2 个答案:

答案 0 :(得分:1)

假设您有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

答案 1 :(得分:0)

删除行:

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触发器中。