顺序递增跳过数字

时间:2018-12-05 23:45:45

标签: node.js postgresql macos express sequence

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

我在PostgreSQL中有与此类似的设置。 (如果有区别,我正在使用运行 Mojave mac )。

我还有其他几列,但问题是ID列。这被设置为顺序的,因此使用Express我将其插入数据库。

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

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

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

1 个答案:

答案 0 :(得分:2)

# 51 vs 53 cluster51vs52.markers <- FindMarkers(alltogether_neurons, "51", "52") write.table (cluster1vs3.markers, "/path/to/alltogether_neurons_51vs52_markers.txt", sep="\t", quote=F, col.names=NA) serial列(Postgres 10或更高版本)从IDENTITY提取数字,并且序列号之间会有空隙。他们的工作是使具有唯一编号的并发写访问成为可能-不是一定是无缝编号。

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

SEQUENCE

不会跳过INSERT INTO tbl (info) SELECT 'xxx' WHERE NOT EXISTS (SELECT FROM tbl WHERE info = 'xxx'); 中的序列ID,因为跳过了重复的插入。 (SEQUENCE仍可能由于其他原因而失败-并烧毁序列号。在这种情况下,您可以重置INSERT

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

但是如果您确实有并发写入,原则上上述方法都无法可靠地工作。您最好学会接受ID中的空白。您始终可以使用SEQUENCE进行查询,以在事实之后生成无间隙的数字。但是,这些数字在一定程度上仍然是任意的。不一定意味着较低的数字是较早提交的。并发写入负载下有例外。相关:

或者考虑使用UUID(日期类型row_number() OVER (ORDER BY id)),避免在巨大密钥空间中使用随机值进行重复的内在问题。完全不是 serial