42P17 — 无效对象定义
42P17 — 无效对象定义
速览
42P17(invalid_object_definition)对象定义可能在继承、生成列或重写规则上冲突。
| 字段 | 值 |
|---|---|
| SQLSTATE | 42P17 |
| 条件名 | invalid_object_definition |
| 状态 | 有效 |
| 已知存在于 | 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_OBJECT_DEFINITION |
| 别名 | — |
含义
对象定义校验覆盖对象关系以及生成列/规则定义。选定路径拒绝继承约束冲突、生成列引用另一个生成列,以及规则递归。
诊断
按消息中点名的对象分类:关系继承、生成列表达式,还是重写规则。检查 pg_inherits 与父子约束定义/继承标志、完整生成表达式或 pg_rewrite 规则;这些路径的修复方式不同。
处理
对于继承约束冲突,比较父子定义和继承标志,并按预期继承契约对齐;不要一概删除继承约束。让生成列表达式只依赖允许的基础列,或打破重写规则环。重试 DDL 前重新检查对象图;仅重命名不能修复递归规则。如果 ERROR 发生在显式事务中,下一次 DDL 前先 ROLLBACK 或回滚到错误前的保存点。
消息
固定源码中的代表性消息包括:message: constraint "%s" conflicts with non-inherited constraint on relation "%s";message: cannot use generated column "%s" in column generation expression; DETAIL: A generated column cannot reference another generated column.;message: infinite recursion detected in rules for relation "%s"。占位符由实际对象、列或参数填充。
版本
锁定目录显示该条件最早见于 PostgreSQL 7.4;行为说明固定在 PostgreSQL 18.6 源码,目录存在范围不等于每条消息或功能都从该版本开始。
相关
来源
源码消息、行号和证据边界见 作者证据。
src/backend/catalog/heap.c:2820-2823(fixed source)src/backend/catalog/heap.c:3237-3242(fixed source)src/backend/rewrite/rewriteHandler.c:2164-2167(fixed source)