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 次 |
| 最近记录: |