我有一个问题。这可能是理论上的。我不能理解我如何按顺序打破值,这会增加表的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)中启动。
答案 0 :(得分:0)
听起来您的序列已明确设置。如果您将序列设置为小于当前最大ID的值,setval
可以执行此操作。然后,默认值与现有值冲突,您将收到错误。
可能发生的第二件事是您可以显式添加具有更大值的ID。在这种情况下,只有在没有为列提供值的情况下才会评估序列,并且它最终会落后。
因此,在这些情况下,请确保您永远不会INSERT
显式ID,也不会无意中调用setval
。然后错误应该永远不会发生(你可以在ID中找到空白,但你不会得到冲突错误)。