我有问题。这可能是理论上的。我无法理解我如何按顺序分解值,即增加表格的id
字段。我有一个数据库服务器和5个客户端。他们在几个小时内同时向该表写入一些数据。数据可以包含数千个条目。Postgres的序列如何被打破?
所以...有时序列可以被打破。我的意思是它具有当前值,即不低于id
字段的最大值,因此我在INSERT
之后得到错误,与现有的id
值有关。
E.g。有时我会遇到一个情况,当表的输入为id
时,该值大于当前值sequence
,该值负责为新条目返回id
字段的值。这个当前值可以等于现有条目的id
。
我在客户端修复了这个问题。我通过查询处理错误
SELECT setval('table_id_seq', COALESCE((SELECT MAX(id)+1 FROM table), 1), false);
但我想知道如何防止此错误的原因。
我有postgresql 9.5,在linux容器(Docker)里面启动。
这不是一个错误。序列/序列不保证没有间隙。只是不*假设*他们没有差距。 – wildplasser
我明白这一点。但有时序列的当前值可能小于最大ID。 – ANtlord
如果您(或您的应用程序)从未分配给序列或目标列,则不会发生这种情况。 (直到环绕,当然) – wildplasser