获取插入 postgres 的最低可用列号

getting lowest available column number for insert postgres

我有一个应用程序,我希望将服装组分配给一个货架号。衣架数量应尽可能少,并且经常更换组(回收衣物)。那么我如何在下面的 table 中找到尽可能低的 rack_number

clothing_groups table

[ id: sequal, rack_number: smallint ]

目前我们正在检索所有 rack_numbers 的升序列表,遍历它们以找到第一个间隙,并将其用于插入下一个 clothing_groups

SELECT
    rack_number
FROM
    clothing_groups
ORDER BY
    rack_number ASC;

这似乎充其量是次优的,我宁愿要么检索单行,要么最好在插入中执行子查询以找到第一个可用的 rack_number

INSERT INTO 
    clothing_groups (rack_number)
VALUES
   SELECT first_available_rack_number FROM clothing_groups WHERE ...

但是我不知道这是否可能或如何实现。

rack_number 行的任意组合都可以有间隙。这意味着序列可能是 [1,2,3,4,5,6,8,12,14..., 231,432,500] 并且它会根据删除和插入动态变化。唯一可以保证的是,存在一个低于 999 的“缺失”数字。

一个选项使用相关子查询:

INSERT INTO clothing_groups (rack_number)
SELECT MIN(rack_number) + 1
FROM clothing_groups cg
WHERE NOT EXISTS (SELECT 1 FROM clothing_groups cg1 WHERE cg1.rack_number = cg.rack_number + 1)

您还可以使用 window 函数:

INSERT INTO clothing_groups (rack_number)
SELECT MIN(rack_number) + 1
FROM (
    SELECT rack_number, LEAD(rack_number) OVER(ORDER BY rack_number) lead_rack_number
    FROM clothing_groups
) cg
WHERE lead_rack_number IS DISTINCT FROM rack_number + 1