# 42P10 — 无效列引用

> PostgreSQL SQLSTATE 42P10：来源与诊断参考。
---

# 42P10 — 无效列引用

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

`42P10`（**invalid_column_reference**）使用列引用的具体操作可能拒绝该引用。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `42P10` |
| 条件名 | `invalid_column_reference` |
| 状态 | `有效` |
| 已知存在于 | `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_INVALID_COLUMN_REFERENCE` |
| 别名 | `—` |

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

## 含义 {#meaning}

多个消费者会因不同的列引用契约报告 `42P10`。18.6 选定路径中，`cookConstraint` 只允许引用拥有 CHECK 约束的表，`CopyGetAttnums` 拒绝在显式 COPY 列表中指定生成列（默认列表会跳过生成列），ON CONFLICT 仲裁器推断找不到合适索引时也会报告此码。后一种情况是推断失败，不是笼统的缺列错误。

## 诊断 {#diagnosis}

先结合完整主消息和 DETAIL 判断阶段：CHECK 约束归属、显式 COPY 列表，还是 ON CONFLICT 仲裁器推断。COPY 要区分用户列列表和默认列表；ON CONFLICT 要按 action 检查候选索引的列或表达式、谓词、排序规则和操作符类；`DO UPDATE` 需要匹配的唯一仲裁器，排除约束不是该 action 的通用替代。没有阶段特定的报文时，不要先判定为缺列。

## 处理 {#response}

修复具体契约：把 CHECK 放在所属表上，显式 COPY 列表排除生成列，或让 ON CONFLICT 与现有合适的唯一索引/约束及其推断细节一致。`DO NOTHING` 也要先核对该 action 的仲裁规则，再考虑排除约束。不要把创建任意约束当成通用修复。如果该 ERROR 发生在显式事务中，下一条命令前执行 `ROLLBACK`，或回滚到语句前建立的保存点，检查目录后再重试。

## 消息 {#messages}

固定源码中的代表性消息包括：message: `only table "%s" can be referenced in check constraint`；message: `column "%s" is a generated column`; DETAIL: `Generated columns cannot be used in COPY.`；message: `there is no unique or exclusion constraint matching the ON CONFLICT specification`。占位符由实际对象、列或参数填充。

## 版本 {#versions}

锁定目录显示该条件最早见于 PostgreSQL 7.4；行为说明固定在 PostgreSQL 18.6 源码，目录存在范围不等于每条消息或功能都从该版本开始。

## 相关 {#related}

- [`42P11`](../42p11/)
- [`42P18`](../42p18/)

## 来源 {#sources}

源码消息、行号和证据边界见 [作者证据](../../data/evidence/42p10.json)。

- `src/backend/catalog/heap.c:3465-3468` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/catalog/heap.c#L3465-L3468))
- `src/backend/commands/copy.c:1026-1030` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/copy.c#L1026-L1030))
- `src/backend/optimizer/util/plancat.c:958-960` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/optimizer/util/plancat.c#L958-L960))
