我有一个表,我想用“优先级”列排序。更改记录的优先级或删除记录时,需要重新排序此列。把它想象成一个数组。这些值将在UI中进行修改,因此我希望它们保持整数并表示较大记录集中的真实位置。优先级列不会有NULL。
id priority
1 2
2 1
3 4
4 3
现在说我将id 4的优先级更改为2,或者我插入或删除一行,如何让所有优先级重新洗牌,以便没有间隙或重复,最高优先级始终是行数?
该表有一个“date_modified”字段,该字段对第二个字符是准确的,并在插入/更新时更新,因此如果需要,可以知道最后修改了哪条记录(当2条记录具有相同的优先级时打破平局)< / p>
答案 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
触发器中。