为什么即使在调用 nextval 之后 pgsql 仍声称序列的 currval 未定义?

Why does pgsql claim the currval of sequence undefined even after calling nextval?

我正在使用 PostgresQL 数据库,其中触发函数将更改记录到历史记录 table。我正在尝试添加一个保留逻辑 "commit ID" 的列,以将主记录和详细记录组合在一起。我已经创建了一个(非临时的)序列,并且在我开始批量更新之前,我会碰到这个。我的所有 SQL 都记录到日志文件中,因此您可以清楚地看到发生的情况:

2015-04-16 10:43:37 SQLSelect: SELECT nextval('commit_id_seq')
2015-04-16 10:43:37 commit_id_seq: 8

...但后来我尝试更新,我的触发器函数尝试使用 currval,但失败了:

2015-04-16 10:43:37 ERROR: ERROR:  currval of sequence "commit_id_seq" is not yet defined in this session
CONTEXT:  SQL statement "INSERT INTO history (table_name, record_id, sec_user_id, created, action, notes, status, before, after, commit_id)
        SELECT TG_TABLE_NAME, rec.id, (SELECT oid FROM pg_roles WHERE rolname = CURRENT_USER), now(), SUBSTR(TG_OP,1,1), note, stat, hstore(old), hstore(new), currval('commit_id_seq')"
PL/pgSQL function log_to_history() line 18 at SQL statement
 [3]

所以我的问题基本上是:WTF?

两个原因之一:

  1. Search_path 差异,所以你实际上是在谈论两个不同的序列。
  2. 不同的会话。 "current value" 仅为您在其中调用 nextval() 的会话定义。

您可以将process-id 添加到日志文件格式中以检查它们是否是不同的会话。