用于检索当前(在运行查询的瞬间)序列值的选项

zer*_*kms 41 postgresql postgresql-8.4

如何在postgresql 8.4中获取当前序列值?

注意:我需要某种统计信息的值,只需要检索和存储.在手动递增的情况下,与并发和竞争条件无关的任何内容与问题无关.

注2:序列在几个表之间共享

注3:currval由于以下原因不起作用:

  • 返回当前会话中此序列的nextval最近获得的值
  • ERROR: currval of sequence "<sequence name>" is not yet defined in this session

我目前的想法是:解析DDL,这很奇怪

Dan*_*ité 83

你可以使用:

SELECT last_value FROM sequence_name;
Run Code Online (Sandbox Code Playgroud)

更新:这在CREATE SEQUENCE语句中有记录:

虽然您无法直接更新序列,但可以使用如下查询:

SELECT*FROM name;

检查序列的参数和当前状态.特别是,序列的last_value字段显示任何会话分配的最后一个值.(当然,如果其他会话正在主动执行nextval调用,那么在打印时,该值可能已过时.)


Boh*_*ian 17

如果该序列用于表中的唯一 ID,您可以简单地执行以下操作:

select max(id) from mytable;
Run Code Online (Sandbox Code Playgroud)

尽管是 postgres 特有的,但最有效的方法是:

select currval('mysequence');
Run Code Online (Sandbox Code Playgroud)

尽管从技术上讲,这会返回调用 生成的最后一个值,调用者nextval('mysequence')不一定会使用该值(如果未使用,则会在自动增量 id 列中留下间隙)。

  • `currval` 不起作用 - 因为它返回当前会话中的最新值。我根本不在当前会话中调用“nextval”,因此“错误:序列“&lt;序列名称&gt;”的 currval 尚未在此会话中定义” (27认同)
  • `max(id)` 不保证甚至接近序列值。PS:还忘了提及该序列是在多个表之间共享的,对此感到抱歉 (7认同)

Ale*_*ore 12

在某个时间点,一个秘密函数(未记录......仍然)确实执行以下操作:

SELECT pg_sequence_last_value('schema.your_sequence_name');

更新:事实证明此功能并非 100% 生产安全。函数名称具有误导性 - 它不是最后发出的值,而是最后保存/缓存到磁盘的值。这意味着它可以显示比实际更高的数字。