ID | info
---------
1 | xxx
2 | xxx
4 | xxx
我在PostgreSQL中有与此类似的设置。 (如果有区别,我正在使用运行 Mojave 的 mac )。
我还有其他几列,但问题是ID
列。这被设置为顺序的,因此使用Express我将其插入数据库。
问题是,即使插入失败,它也会在每个插入上增加ID
。 info
被定义为unique
,因此尝试插入现有的info
会返回错误。但是ID
仍在递增。
例如,如果我插入两行,则有id 1
和id 2
。然后是另一个因唯一违规而失败的。下一次成功插入将得到id = 4
,跳过id = 3
。
我可以设置Postgres使其在失败的插入时不会增加吗?
答案 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 ,