42P10 — 无效列引用
42P10 — 无效列引用
速览
42P10(invalid_column_reference)使用列引用的具体操作可能拒绝该引用。
| 字段 | 值 |
|---|---|
| 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 |
| 别名 | — |
含义
多个消费者会因不同的列引用契约报告 42P10。18.6 选定路径中,cookConstraint 只允许引用拥有 CHECK 约束的表,CopyGetAttnums 拒绝在显式 COPY 列表中指定生成列(默认列表会跳过生成列),ON CONFLICT 仲裁器推断找不到合适索引时也会报告此码。后一种情况是推断失败,不是笼统的缺列错误。
诊断
先结合完整主消息和 DETAIL 判断阶段:CHECK 约束归属、显式 COPY 列表,还是 ON CONFLICT 仲裁器推断。COPY 要区分用户列列表和默认列表;ON CONFLICT 要按 action 检查候选索引的列或表达式、谓词、排序规则和操作符类;DO UPDATE 需要匹配的唯一仲裁器,排除约束不是该 action 的通用替代。没有阶段特定的报文时,不要先判定为缺列。
处理
修复具体契约:把 CHECK 放在所属表上,显式 COPY 列表排除生成列,或让 ON CONFLICT 与现有合适的唯一索引/约束及其推断细节一致。DO NOTHING 也要先核对该 action 的仲裁规则,再考虑排除约束。不要把创建任意约束当成通用修复。如果该 ERROR 发生在显式事务中,下一条命令前执行 ROLLBACK,或回滚到语句前建立的保存点,检查目录后再重试。
消息
固定源码中的代表性消息包括: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。占位符由实际对象、列或参数填充。
版本
锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。
相关
来源
源码消息、行号和证据边界见 作者证据。
src/backend/catalog/heap.c:3465-3468(fixed source)src/backend/commands/copy.c:1026-1030(fixed source)src/backend/optimizer/util/plancat.c:958-960(fixed source)