ID | info
---------
1 | xxx
2 | xxx
4 | xxx
我在 PostgreSQL 中有一个与此类似的设置。 (我使用的是运行 Mojave 的 mac,如果有区别的话)。
我还有几列,但问题是 ID
列。这被设置为顺序的,所以我使用 Express 插入到数据库中。
问题是,即使插入失败,它也会在每次插入时增加 ID
。 info
被定义为 unique
,因此尝试插入现有的 info
会返回错误。但是 ID
仍然递增。
例如,如果我插入 2 行,我有 id 1
和 id 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)
进行查询,以在事后生成无缝数字。然而,这些数字在一定程度上仍然是任意的。较小的数字不一定较早提交。并发写入负载下存在异常。相关:
- Primary Key Value Not Incrementing Correctly
- Serial numbers per group of rows for compound key
- Auto increment table column
或者考虑使用 UUID(dat 类型 uuid
)并避免在 巨大 key 空间中具有随机值的重复项的固有问题。一点也不系列,不过:
关于node.js - 顺序递增跳数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53642512/