为什么即使在调用 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?
两个原因之一:
- Search_path 差异,所以你实际上是在谈论两个不同的序列。
- 不同的会话。 "current value" 仅为您在其中调用 nextval() 的会话定义。
您可以将process-id 添加到日志文件格式中以检查它们是否是不同的会话。
我正在使用 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?
两个原因之一:
- Search_path 差异,所以你实际上是在谈论两个不同的序列。
- 不同的会话。 "current value" 仅为您在其中调用 nextval() 的会话定义。
您可以将process-id 添加到日志文件格式中以检查它们是否是不同的会话。