Postgres:如何插入带有自动增量 ID 的行

use*_*472 13 postgresql insert auto-increment select

有一个表“上下文”。有一个自动增量 ID“context_id”。我正在使用序列来检索下一个值。

SELECT nextval('context_context_id_seq')
Run Code Online (Sandbox Code Playgroud)

结果是:1, 2, 3,...20....

但是“上下文”表中有 24780 行

如何获得下一个值 (24781)?

我需要在 INSERT 语句中使用它

a_h*_*ame 27

显然,您在没有使用序列的情况下将行插入到该表中,这就是它们不同步的原因。

您需要使用 setval()

select setval('context_context_id_seq', (select max(context_id) from context));
Run Code Online (Sandbox Code Playgroud)

然后下一次调用nextval()应该返回正确的值。

如果该列确实定义为serial(Postgres 中没有“自动增量”),那么您应该让 Postgres 完成它的工作,并且在插入过程中永远不要提及它:

insert into context (some_column, some_other_column)
values (42, 'foobar');
Run Code Online (Sandbox Code Playgroud)

将确保应用 context_id 列的默认值。或者,您可以使用:

insert into context (context_id, some_column, some_other_column)
values (default, 42, 'foobar');
Run Code Online (Sandbox Code Playgroud)

  • @ user503207:序列**从不**保证无间隙。 (5认同)
  • 并且在使用串行计数时仍然可以跳过 1 或 2 个 ID。那是因为 postgresql 首先采用 nextval 然后尝试插入,如果由于某种原因而失败,则该 id 已被使用 (2认同)
  • 自动增量字段、序列、序列号、身份,无论你想怎么称呼它们,通常都有一个缓存机制,这意味着不可能保证严格线性无间隙单调递增的整数序列。 (2认同)