tha*_*pNB 6 postgresql macos sequence node.js express
ID | info
---------
1 | xxx
2 | xxx
4 | xxx
Run Code Online (Sandbox Code Playgroud)
我在 PostgreSQL 中有一个与此类似的设置。(如果有区别的话,我使用的是运行Mojave的mac)。
我还有几列,但问题是ID
列。这被设置为顺序的,所以使用 Express 我插入到数据库中。
问题是,它会增加ID
每个插入甚至失败的插入。info
已定义unique
,因此尝试插入现有会info
返回错误。但是ID
还是递增。
例如,如果我插入 2 行,我有id 1
& id 2
。然后另一个因唯一违规而失败。下一个成功的插入获取id = 4
,跳过id = 3
。
我可以设置 Postgres 使其不会在插入失败时增加吗?
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:
归档时间: |
|
查看次数: |
3465 次 |
最近记录: |