代码之家  ›  专栏  ›  技术社区  ›  SpliFF

对整列中的值进行无序排列,使其始终唯一且连续

  •  1
  • SpliFF  · 技术社区  · 14 年前

    我有一个表,我想用“优先级”列排序。当更改记录的优先级或删除记录时,需要重新排序此列。把它想象成一个数组。这些值将在一个用户界面中被修改,所以我希望它们保持整数,并代表较大记录集中的真实位置。优先级列不包含空值。

    id       priority
    1        2
    2        1
    3        4
    4        3
    

    现在假设我将ID 4的优先级更改为2,或者我插入或删除一行,我如何获得所有要重新调整的优先级,这样就不会有空白或重复,并且可能的最高优先级始终是行数?

    该表有一个“日期修改”字段,精确到第二个字段,并在插入/更新时更新,因此,如果需要,可以知道最后修改的是哪个记录(当两个记录具有相同的优先级时,打破平局)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Scott Bailey    14 年前

    假设您有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
    
        2
  •  0
  •   egrunin    14 年前

    删除行:

    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 触发,如果你想的话。