node.js - 顺序递增跳数

标签 node.js postgresql macos express sequence

ID | info
---------
1  | xxx
2  | xxx
4  | xxx

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

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

问题是,即使插入失败,它也会在每次插入时增加 IDinfo 被定义为 unique,因此尝试插入现有的 info 会返回错误。但是 ID 仍然递增。

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

我能否设置 Postgres,使其不会在插入失败时递增?

最佳答案

serial 列,或 Postgres 10 或更高版本中的 IDENTITY,从 SEQUENCE 中提取数字,并且预计会有间隙。他们的工作是使用唯一编号实现并发写入访问 - 不一定无间隙编号。

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

INSERT INTO tbl (info) 
SELECT 'xxx'
WHERE NOT EXISTS (SELECT FROM tbl WHERE info = 'xxx');

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

在单个语句中插入多行时,您还必须排除插入的集合中的重复项。示例代码:

但是如果您确实有并发写入,原则上,以上都不能可靠地工作。您最好学会接受 ID 中的差距。您始终可以使用 row_number() OVER (ORDER BY id) 进行查询,以在事后生成无缝数字。然而,这些数字在一定程度上仍然是任意的。较小的数字不一定较早提交。并发写入负载下存在异常。相关:

或者考虑使用 UUID(dat 类型 uuid)并避免在 巨大 key 空间中具有随机值的重复项的固有问题。一点也不系列,不过:

关于node.js - 顺序递增跳数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53642512/

相关文章:

node.js - Puppeteer/Nodejs,如何等待事件条件满足

node.js - 如何使用 Sirv 访问 Heroku 分配的端口?

javascript - 通过 DefinePlugin 使用 Webpack 传递 NODE_ENV 值

sql - PostgreSQL 在递归查询中找到所有可能的组合(排列)

sql - PostgreSQL:按查询选择组中的 N 个结果

mysql - 无需密码即可连接 Sequelize 到 MySQL?

unit-testing - 如何在 Play Framework v2 中指定用于测试目的的自定义数据库连接参数?

objective-c - Mac 应用程序 - 禁用特定 USB 端口

objective-c - 更改 CGDisplayMode 属性

objective-c - 文件夹观察者 - Cocoa/Obj C