Postgres的序列如何被打破?

时间:2016-08-17 11:22:03

标签: postgresql sequence

我有一个问题。这可能是理论上的。我不能理解我如何按顺序打破值,这会增加表的id字段。我有一个数据库服务器和5个客户端。他们在几个小时内同时向该表写入一些数据。数据可以包含数千个条目。

所以......有时候序列可能被打破。我的意思是它具有当前值,它不会小于id字段的最大值,因此我在INSERT之后得到一个与现有id值相关的错误。< / p>

电子。 G。有时我会遇到一个案例,当表格中包含id的条目时,大于当前值sequence,它负责为新条目返回id字段的值。此当前值可以等于现有条目的id

我在客户端解决这个问题。我通过查询处理错误

SELECT setval('table_id_seq', COALESCE((SELECT MAX(id)+1 FROM table), 1), false); 

但我想知道如何防止出现此错误的原因。

我有postgresql 9.5,在linux容器(Docker)中启动。

1 个答案:

答案 0 :(得分:0)

听起来您的序列已明确设置。如果您将序列设置为小于当前最大ID的值,setval可以执行此操作。然后,默认值与现有值冲突,您将收到错误。

可能发生的第二件事是您可以显式添加具有更大值的ID。在这种情况下,只有在没有为列提供值的情况下才会评估序列,并且它最终会落后。

因此,在这些情况下,请确保您永远不会INSERT显式ID,也不会无意中调用setval。然后错误应该永远不会发生(你可以在ID中找到空白,但你不会得到冲突错误)。