连续递增跳过数字

tha*_*pNB 6 postgresql macos sequence node.js express

ID | info
---------
1  | xxx
2  | xxx
4  | xxx
Run Code Online (Sandbox Code Playgroud)

我在 PostgreSQL 中有一个与此类似的设置。(如果有区别的话,我使用的是运行Mojavemac)。

我还有几列,但问题是ID列。这被设置为顺序的,所以使用 Express 我插入到数据库中。

问题是,它会增加ID每个插入甚至失败的插入。info已定义unique,因此尝试插入现有会info返回错误。但是ID还是递增。

例如,如果我插入 2 行,我有id 1& id 2。然后另一个因唯一违规而失败。下一个成功的插入获取id = 4,跳过id = 3

我可以设置 Postgres 使其不会在插入失败时增加吗?

Erw*_*ter 9

serial 列,或IDENTITY在 Postgres 10 或更高版本中,从 a 中绘制数字,SEQUENCE并且预期会有间隙。他们的工作就是让并发写入访问可能具有独特的号码-没有一定的差距少的数字。

如果您实际上没有并发写入访问权限,则有一些简单的方法可以实现(主要是)无间隙数字。喜欢:

INSERT INTO tbl (info) 
SELECT 'xxx'
WHERE NOT EXISTS (SELECT FROM tbl WHERE info = 'xxx');
Run Code Online (Sandbox Code Playgroud)

这不会从 中烧录序列号,SEQUENCE因为跳过了重复的插入。(INSERT可能仍然因任何其他原因失败 - 并刻录序列号。在这种情况下,您可以重置SEQUENCE

虽然在单个语句插入多行,你还必须排除重复插入集。示例代码:

但是,如果您确实有并发写入,则原则上上述方法都不可靠。您最好学会接受 ID 中的空白。您始终可以进行查询以row_number() OVER (ORDER BY id)在事后生成无间隙数字。然而,这些数字在一定程度上仍然是任意的。较小的数字不一定更早提交。并发写负载下有例外。有关的:

或者考虑使用 UUID(数据类型uuid)并避免在巨大的密钥空间中使用随机值重复的固有问题。不过,根本不是serial