# 55000 — 对象未处于前置状态

> PostgreSQL SQLSTATE 55000（对象未处于前置状态，object_not_in_prerequisite_state）的源码证据、诊断与处理参考。
---

# 55000 — 对象未处于前置状态

## 速览 {#at-a-glance}

`55000` 表示请求的操作缺少某个必要的对象或服务器状态。本页选择 `currval` 所需的会话级序列前提；预加载、恢复和无效索引是不同机制。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `55000` |
| 条件名 | `object_not_in_prerequisite_state` |
| 状态 | `有效` |
| 已知存在于 | `7.4` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE` |
| 别名 | `—` |

<!-- source facts: data/errcodes/55000.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

`currval` 按后端会话记录状态。创建序列，或在另一个会话调用 `nextval`，都不会初始化当前会话。固定序列模板为 `currval of sequence "%s" is not yet defined in this session`，严重级别为 `ERROR`。

其他固定的 55000 路径有不同前提：`pg_stat_statements` 报 `pg_stat_statements must be loaded via "shared_preload_libraries"`，应按正常配置流程加入启动参数并重启服务；`pg_surgery` 报 `recovery is in progress`，detail 为 `Heap surgery functions cannot be executed during recovery.`，应等待恢复完成，或在合适的可写 primary 上执行；`pgstattuple` 报 `index "%s" is not valid`，应先检查索引，并按适当的 `REINDEX` 或迁移流程重建后再调用。它们都是对象或服务器状态检查，不是权限错误，也不能与会话级序列案例互相替代。

## 诊断 {#diagnosis}

先确认对象状态以及对象所属的后端会话。对本路径，确认序列并检查这个 backend 是否调用过 `nextval`；连接池中另一个连接调用过也不满足当前会话前提。在显式事务中，失败的 `currval` 会使事务中止，因此修复前要执行 `ROLLBACK` 或 `ROLLBACK TO SAVEPOINT`。其他 55000 路径还要检查恢复状态、预加载设置、索引有效性或对象自身前提。

## 处理 {#response}

在同一 backend 先调用 `nextval` 再调用 `currval`；如果业务契约如此设计，也可以传入明确已知的值。自动提交时失败语句的事务已结束，可以重新发起下一条语句；显式事务中则先回滚或回滚到保存点，再调用 `nextval`。不要把它当作权限错误，也不要假设连接池中另一个连接的成功调用会初始化当前连接。

## 实测诊断 {#messages}

选定源码组为 `ERROR`，使用上述动态序列名模板。实测诊断中的序列名为 `currval_sequence`；错误后自动提交会话仍为 `IDLE`，同一会话随后通过 `nextval` 和 `currval` 返回 10。

## 代表案例 {#case}

选定注册表在一个自动提交 backend 上创建序列，然后在尚未调用 `nextval` 时调用 `currval`，再用 `nextval`（返回 10）初始化并再次读取 `currval`（返回 10）。失败调用、修复和验证属于同一会话状态转换；本案例不测试连接池切换。

<!-- BEGIN SQLSTATE SNIPPET: currval_before_nextval -->

```sql
CREATE SEQUENCE sequence_identifier START WITH 10;
SELECT currval('sequence_regclass');
SELECT nextval('sequence_regclass');
SELECT currval('sequence_regclass')
```

<!-- END SQLSTATE SNIPPET -->

选定的 PostgreSQL 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态或断开恢复、修复、清理和一次性实例停止断言。详见 [`案例 JSON`](../../data/cases/55000.json) 与 [`作者证据`](../../data/evidence/55000.json)。

## 版本 {#versions}

锁定目录从 7.4 起记录 55000。18.6 与 10.21 的序列会话案例均通过；这不覆盖其他 55000 分支，也不推断所有中间版本。

## 相关 {#related}

- [`55006`](../55006/)
- [`42501`](../42501/)

## 来源 {#sources}

- `src.errcodes.18.6` — `src/backend/utils/errcodes.txt` at `724edf9bde9d356724ad384a2e196edc3c9f80f7`; blob SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt#L424)).
- `src.currval.18.6` — `src/backend/commands/sequence.c` at `724edf9bde9d356724ad384a2e196edc3c9f80f7`; blob SHA-256 `3e5afe17d5a84862fae502a5481211220368f1d639e9d07ba6f96ee8be92a8d8` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/sequence.c#L884-L887)).
- `src.currval.10.23` — `src/backend/commands/sequence.c` at `02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4`; blob SHA-256 `5510e1266e8d8c548a4318d753392e92e689d348f3353a2aa53d8dea871c44ab` ([source](https://github.com/postgres/postgres/blob/02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4/src/backend/commands/sequence.c#L845-L848)).
- `src.path.0` — `contrib/pg_stat_statements/pg_stat_statements.c` at `724edf9bde9d356724ad384a2e196edc3c9f80f7` 的 `shared_preload_libraries` 检查（[来源](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/pg_stat_statements/pg_stat_statements.c#L1685-L1687)）。
- `src.path.1` — `contrib/pg_surgery/heap_surgery.c` at `724edf9bde9d356724ad384a2e196edc3c9f80f7` 的恢复状态检查与 detail（[来源](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/pg_surgery/heap_surgery.c#L99-L102)）。
- `src.path.2` — `contrib/pgstattuple/pgstatindex.c` at `724edf9bde9d356724ad384a2e196edc3c9f80f7` 的无效索引检查（[来源](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/contrib/pgstattuple/pgstatindex.c#L244-L247)）。
- `src.calls.REL_18_6` / `src.calls.REL_10_23` — fixed call scans, SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf` / `00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c`.
- `manifest.55000` / `snippet-registry.55000` — hashes are recorded in `evidence/55000.json` and each selected runtime record.
