↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 状态码 / Class 42 语法错误或访问规则违反

42P01 undefined_table

未定义的表或关系

ERROR 已实测 详解 实测通过

条件名
undefined_table
宏名称
ERRCODE_UNDEFINED_TABLE
最早已知存在
7.4
状态
有效

手册收录:8.1、8.2、8.3、8.4、9.0、9.1、9.2、9.3、9.4、9.5、9.6、10、11、12、13、14、15、16、17、18、19、20。此处仅表示同版本手册收录,运行证据仍以原核验构建为准。

版本覆盖

版本条依据已采样构建显示;灰色版本可能尚未采样,悬停可查看。手册链接随版本选择,源码和运行证据保持原核验构建。

速览 {#at-a-glance}

42P01 是 PostgreSQL 类别 42 syntax_error_or_access_rule_violation 中的 undefined_table 条件。这个名称沿袭已久;无法解析的引用可以是表、视图、物化视图、外部表或其他关系名称。

普通诊断是未限定引用的 relation "%s" does not exist,或限定引用的 relation "%s.%s" does not exist。解析器在查询执行前报告 SQLSTATE;自动提交连接不会因为这个查询错误留下失败事务。

代表性案例查询不存在的模式限定关系,再创建有效关系并读取它。PostgreSQL 18.6 和隔离的 PostgreSQL 10.21 目标均返回 42P01,连接保持 IDLE,修正后的查询成功。run ID 和断言见公开证据 JSON。

含义与触发路径 {#meaning}

解析阶段会根据当前命名空间和 search_path 解析每个关系。如果限定名称不存在,parse_relation.c 产生两部分名称报文;如果未限定名称不存在,则产生一部分名称报文。拼写错误、迁移尚未执行、连接了错误数据库、search_path 不同,或者带引号标识符大小写不一致,都可能产生这个 SQLSTATE。

这是名称解析错误,不等于物理表一定被删除。关系可能存在于另一个模式或数据库中,角色也可能缺少查看或使用它所需的权限。反过来,按猜测的名称创建表会掩盖部署或引用错误。

解析器还会在某些无效 FROM 项引用和 CTE 前向引用中使用 42P01,但 detail 或 hint 可能不同。应结合完整报文和上下文,将这些形式与缺少关系区分开。

报文与诊断 {#messages}

runner 的操作先限定模式查询,再查询修正后的关系。隔离 harness 提供临时模式;查询形状如下:

SELECT * FROM does_not_exist;
CREATE TABLE exists(id integer PRIMARY KEY);
SELECT count(*) FROM exists;

PostgreSQL 18.6 返回:

SQLSTATE: 42P01
severity: ERROR
message_primary: relation "c42p01_missing_relation.does_not_exist" does not exist
source: parse_relation.c / parserOpenTable / line 1480

PG10 目标返回相同的主报文,对应源码行号为 1159。限定形式会在报文中保留模式和关系名称。未限定引用使用固定源码模板 relation "%s" does not exist;CTE 前向引用或无效 FROM 引用可能附带 detail 或 hint。

诊断 {#diagnosis}

记录 SQLSTATE、主报文、detail、hint、语句位置、当前数据库、角色和 search_path。检查应用使用的准确拼写与引用方式。通过有权限的管理连接查询 pg_class/pg_namespace 或使用 to_regclass(),确认关系实际存在的位置。

对照已部署迁移版本、连接数据库和模式。连接池中的 session 可能带有不同于建表连接的 search_path。如果对象预期是临时对象,应确认查询仍在创建它的同一个 session 中执行。

代表性错误发生在自动提交下,连接保持 IDLE;修正后的查询返回 count 0 并仍为 IDLE。如果缺少关系的引用发生在显式事务中,事务仍可能进入 INERROR,因此应记录实际状态,不要假定所有 42P01 都不会影响周围工作。

处理与修复 {#response}

按部署和应用配置修复名称解析原因:

  • 明确选择目标模式,或为 session 设置并验证 search_path。
  • 在提供查询前于正确数据库执行缺少的迁移。
  • 对大小写敏感的标识符保留准确的双引号;检查依赖后再按统一约定重命名。
  • 只有在缺少对象是预期分支时才使用 to_regclass() 等预检;意外部署失败不应静默创建替代关系。

修正关系后重新执行原查询,并验证返回值和事务状态。成功执行 CREATE TABLE 或打开新连接,都不能证明所有应用 session 解析到同一个对象。

版本与边界 {#versions}

目录在 PostgreSQL 7.4 的锁定定义中已观察到 42P01,并持续到 8.4.22 的 pre-9.0 定义;随后在列出的所有正式快照直到 PostgreSQL 18.6 以及 PostgreSQL 19 Beta 3 预览中存在。这是 definition_only 的存在边界,不是确切实现引入版本或运行时使用断言。扫描范围内没有记录该条件的定义变化。

缺少关系案例在 PostgreSQL 18.6 和 10.21 上均通过。源码行号和解析器 hint 会因版本及引用形式变化。本页覆盖模式限定的缺少关系和有效后续查询,不覆盖所有使用 42P01 的命名空间或访问规则路径。

相关 {#related}

42P02 — undefined_parameter 处理缺少查询参数。3F000 — invalid_schema_name 处理无效模式名称。42501 — insufficient_privilege 是名称解析之后的访问失败。57014 — query_canceled 可能中断修复查询,但原因不同。

来源 {#sources}

结构化证据记录在公开证据 JSON中。源码记录固定到 PostgreSQL commit 724edf9bde9d356724ad384a2e196edc3c9f80f7;运行记录保留两个目标 ID 和结构化观察。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed 案例:missing_relation
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed 案例:missing_relation

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 relation "%s.%s" does not exist

来源: 来源:src/backend/parser/parse_relation.c(lines 1473-1501) @ REL_18_6

适用范围:The qualified form is selected when the parser has a schema-qualified relation reference.

主消息 relation "%s" does not exist

来源: 来源:src/backend/parser/parse_relation.c(lines 1473-1501) @ REL_18_6

适用范围:The unqualified form is selected when lookup through the active namespace fails.

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

missing_relation PG 10 / 18 有 SQL

前置条件

  • A disposable schema name that has no relation

触发

Select from a relation that does not exist.

断言

  • SQLSTATE is 42P01
  • The missing relation is named in the diagnostic
  • A valid query succeeds after correcting the relation name

处置

Check schema qualification, search_path, migrations, and case-sensitive quoting before creating or renaming objects.

清理

Drop the case schema with an owner connection.

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 42 语法错误或访问规则违反 Syntax Error or Access Rule Violation 44 个 ↗
42000 syntax_error_or_access_rule_violation ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION ERROR 7.4 起已知
语法错误或访问规则违反的总类,见具体子码。 有效
42501 insufficient_privilege ERRCODE_INSUFFICIENT_PRIVILEGE ERROR 7.4 起已知
当前角色对目标对象的权限不足。 有效
42601 syntax_error ERRCODE_SYNTAX_ERROR ERROR 7.4 起已知
SQL 语句存在语法错误,解析器拒绝执行。 有效
42602 invalid_name ERRCODE_INVALID_NAME ERROR 7.4 起已知
名称不合法,如 enum 标签超出长度限制。 有效
42611 invalid_column_definition ERRCODE_INVALID_COLUMN_DEFINITION ERROR 7.4 起已知
列定义无效,如继承的父表默认值冲突。 有效
42622 name_too_long ERRCODE_NAME_TOO_LONG ERROR 7.4 起已知
标识符或 name 值超出长度上限。 有效
42701 duplicate_column ERRCODE_DUPLICATE_COLUMN ERROR 7.4 起已知
同一定义中重复指定了同名列。 有效
42702 ambiguous_column ERRCODE_AMBIGUOUS_COLUMN ERROR 7.4 起已知
列引用有歧义,多个表都有该列名。 有效
42703 undefined_column ERRCODE_UNDEFINED_COLUMN ERROR 7.4 起已知
引用的列在目标关系中不存在。 有效
42704 undefined_object ERRCODE_UNDEFINED_OBJECT ERROR 7.4 起已知
引用的数据库对象不存在,如触发器或类型。 有效
42710 duplicate_object ERRCODE_DUPLICATE_OBJECT ERROR 7.4 起已知
要定义的对象名已被占用,如重复 CREATE TYPE。 有效
42712 duplicate_alias ERRCODE_DUPLICATE_ALIAS ERROR 7.4 起已知
同一查询命名空间中重复使用了表别名。 有效
42723 duplicate_function ERRCODE_DUPLICATE_FUNCTION ERROR 7.4 起已知
同一模式下已存在同名同参数类型的函数。 有效
42725 ambiguous_function ERRCODE_AMBIGUOUS_FUNCTION ERROR 7.4 起已知
函数调用有多个候选,无法选出最佳匹配。 有效
42803 grouping_error ERRCODE_GROUPING_ERROR ERROR 7.4 起已知
分组查询输出了既未分组也未聚合的列。 有效
42804 datatype_mismatch ERRCODE_DATATYPE_MISMATCH ERROR 7.4 起已知
表达式类型与目标上下文要求的类型不符。 有效
42809 wrong_object_type ERRCODE_WRONG_OBJECT_TYPE ERROR 7.4 起已知
命令本身有效,但不能作用于该类对象。 有效
42830 invalid_foreign_key ERRCODE_INVALID_FOREIGN_KEY ERROR 7.4 起已知
外键在被引用列上找不到合格的唯一键。 有效
42846 cannot_coerce ERRCODE_CANNOT_COERCE ERROR 7.4 起已知
源类型到目标类型之间没有可用的 cast。 有效
42883 undefined_function ERRCODE_UNDEFINED_FUNCTION ERROR 7.4 起已知
按名称和参数类型找不到匹配的函数或操作符。 有效
428C9 generated_always ERRCODE_GENERATED_ALWAYS ERROR 10.0 起已知
向身份列或生成列赋值,这类列只接受 DEFAULT。 有效
42939 reserved_name ERRCODE_RESERVED_NAME ERROR 7.4 起已知
对象名使用了保留名称,如模式或表空间。 有效
42P01 undefined_table ERRCODE_UNDEFINED_TABLE ERROR 7.4 起已知
引用的表、视图或其他关系不存在。 有效
42P02 undefined_parameter ERRCODE_UNDEFINED_PARAMETER ERROR 7.4 起已知
查询引用了解析器未知的位置参数,如 $1。 有效
42P03 duplicate_cursor ERRCODE_DUPLICATE_CURSOR ERROR 7.4 起已知
游标或 portal 名称与已有的冲突。 有效
42P04 duplicate_database ERRCODE_DUPLICATE_DATABASE ERROR 7.4 起已知
集群中已存在同名数据库。 有效
42P05 duplicate_prepared_statement ERRCODE_DUPLICATE_PSTATEMENT ERROR 7.4 起已知
当前会话已有同名的服务端预备语句。 有效
42P06 duplicate_schema ERRCODE_DUPLICATE_SCHEMA ERROR 7.4 起已知
要创建的模式名在当前数据库中已存在。 有效
42P07 duplicate_table ERRCODE_DUPLICATE_TABLE ERROR 7.4 起已知
关系名已存在,或继承父项重复。 有效
42P08 ambiguous_parameter ERRCODE_AMBIGUOUS_PARAMETER ERROR 7.4 起已知
参数存在但无法推导出一致而具体的类型。 有效
42P09 ambiguous_alias ERRCODE_AMBIGUOUS_ALIAS ERROR 7.4 起已知
一个表引用对应多个关系命名空间项。 有效
42P10 invalid_column_reference ERRCODE_INVALID_COLUMN_REFERENCE ERROR 7.4 起已知
列引用不符合该操作的契约,如 COPY 生成列。 有效
42P11 invalid_cursor_definition ERRCODE_INVALID_CURSOR_DEFINITION ERROR 7.4 起已知
游标声明违反定义阶段规则,如 SCROLL 选项冲突。 有效
42P12 invalid_database_definition ERRCODE_INVALID_DATABASE_DEFINITION ERROR 7.4 起已知
数据库定义无效,核心源码中未见触发路径。 有效
42P13 invalid_function_definition ERRCODE_INVALID_FUNCTION_DEFINITION ERROR 7.4 起已知
函数、聚合或触发器声明在校验阶段失败。 有效
42P14 invalid_prepared_statement_definition ERRCODE_INVALID_PSTATEMENT_DEFINITION ERROR 7.4 起已知
PREPARE 定义预备语句时失败。 有效
42P15 invalid_schema_definition ERRCODE_INVALID_SCHEMA_DEFINITION ERROR 7.4 起已知
CREATE SCHEMA 的模式声明不一致被拒绝。 有效
42P16 invalid_table_definition ERRCODE_INVALID_TABLE_DEFINITION ERROR 7.4 起已知
表定义无效,如分区键或主键规则冲突。 有效
42P17 invalid_object_definition ERRCODE_INVALID_OBJECT_DEFINITION ERROR 7.4 起已知
对象定义无效,如继承、生成列或规则冲突。 有效
42P18 indeterminate_datatype ERRCODE_INDETERMINATE_DATATYPE ERROR 7.4 起已知
无法推断表达式或参数的数据类型。 有效
42P19 invalid_recursion ERRCODE_INVALID_RECURSION ERROR 8.4.0 起已知
递归查询结构不合法,执行前被检查拒绝。 有效
42P20 windowing_error ERRCODE_WINDOWING_ERROR ERROR 8.4.0 起已知
窗口函数调用或框架边界定义不合法。 有效
42P21 collation_mismatch ERRCODE_COLLATION_MISMATCH ERROR 9.1.0 起已知
参与运算的排序规则不兼容,产生冲突。 有效
42P22 indeterminate_collation ERRCODE_INDETERMINATE_COLLATION ERROR 9.1.0 起已知
操作需要唯一排序规则,但无法确定。 有效