选择 打开 改范围 完整检索页

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

文档 / SQL 状态码 / Class 54 程序限制超出

54011 too_many_columns

ERROR 源码确认 详解 未实测

类别
Class 54 程序限制超出
严重等级
ERROR
条件名
too_many_columns
宏名称
ERRCODE_TOO_MANY_COLUMNS
启用版本
7.4
状态
活跃

版本覆盖

速览

54011 表示物理 tuple descriptor 或相关对象定义超过固定列数上限。源码路径决定计数对象是表属性、索引键加 INCLUDE 列、分区键、统计维度还是产生行的定义。

含义

固定消息包括实际/上限列数、表最多列数、索引最多列数、分区键上限和统计专用变体。表计数使用物理属性号:已删除列仍占 tuple descriptor 槽位,所以可见列数可能低于 relnatts。索引键与 INCLUDE、分区键和统计维度各有独立上限,虽然都使用此 SQLSTATE。

锁定的 18.6 构建中,相关常量分别是用户表属性 MaxHeapAttributeNumber = 1600、tuple 属性 MaxTupleAttributeNumber = 1664INDEX_MAX_KEYS = 32PARTITION_MAX_KEYS = 32 以及 STATS_MAX_DIMENSIONS = 8。这些数值属于不同 guard;服务器诊断中的实际 count 和 limit 字段仍是判断依据。

报文模板

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

主消息 number of columns (%d) exceeds limit (%d)

来源:src/backend/access/common/heaptuple.c @ REL_18_6

主消息 number of index columns (%d) exceeds limit (%d)

来源:src/backend/access/common/indextuple.c @ REL_18_6

主消息 tables can have at most %d columns

来源:src/backend/catalog/heap.c @ REL_18_6

主消息 cannot partition using more than %d columns

来源:src/backend/commands/tablecmds.c @ REL_18_6

主消息 cannot use more than %d columns in an index

来源:src/backend/commands/indexcmds.c @ REL_18_6

主消息 cannot have more than %d columns in statistics

来源:src/backend/commands/statscmds.c @ REL_18_6

主消息 column definition lists can have at most %d entries

来源:src/backend/parser/parse_relation.c @ REL_18_6

诊断

从消息和上下文读取对象类型、实际数、上限和 DDL 操作。表或继承表要检查 pg_class.relnatts 与包含 attisdroppedpg_attribute,不能只数可见列名。索引 DDL 要把 INCLUDE 列算入,分区和 extended statistics 则检查各自的键/维度数;FROM 中函数的 column definition list 也有 54011 的行形状上限。

处理

减少或拆分对象定义,改用其他索引/分区设计,或把派生数据移到关联表。若原因是 dropped 的物理槽位,再删除可见列并不会回收它们;普通物理重写(如 VACUUM FULLCLUSTER)也会在 tuple descriptor 中保留这些 dropped attribute。应新建具有目标逻辑列布局的表,在保留依赖的前提下迁移数据,再有选择地减少索引键/INCLUDE 列或统计维度并验证 DDL。显式事务中若发生 ERROR,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在 schema 变更真正消除上限后才能重试。

版本

锁定目录从 7.4 记录;引用 heap、index、table、partition、statistics 和 row-shape 路径来自 PostgreSQL 18.6,未创建超大 schema。

来源

证据

断言

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

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 54 程序限制超出 Program Limit Exceeded 4 个
54000 program_limit_exceeded ERRCODE_PROGRAM_LIMIT_EXCEEDED ERROR 7.4
超出程序固定上限,如数组维度或分配大小。 活跃
54001 statement_too_complex ERRCODE_STATEMENT_TOO_COMPLEX ERROR 7.4
语句过于复杂,超出 grouping set 或栈深度上限。 活跃
54011 too_many_columns ERRCODE_TOO_MANY_COLUMNS ERROR 7.4
对象定义的列数超过上限,如表属性或索引键。 活跃
54023 too_many_arguments ERRCODE_TOO_MANY_ARGUMENTS ERROR 7.4
函数或过程的参数个数超过编译时上限。 活跃