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

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

百科 / 错误代码 / Class 42 语法错误或访问规则冲突

428C9 generated_always

GENERATED ALWAYS 列赋值

ERROR 源码确认 详解 未实测

条件名
generated_always
宏名称
ERRCODE_GENERATED_ALWAYS
启用版本
10
状态
活跃

版本覆盖

速览

428C9generated_always)是重写阶段的 ERROR:INSERT 或 UPDATE 向必须由服务器生成或只接受 DEFAULT 的列提供了值。身份列和生成列的赋值规则不同,必须结合操作类型和列元数据判断。

含义

重写器会把 INSERT 中省略的目标列或显式 DEFAULT 标为 apply_defaultGENERATED ALWAYS 身份列收到非默认值时,除非使用 OVERRIDING SYSTEM VALUE,否则报错;OVERRIDING USER VALUE 会强制使用默认生成。BY DEFAULT 身份列通常允许显式值,但 OVERRIDING USER VALUE 仍会强制生成。生成列无论是否有 OVERRIDING 都只接受 DEFAULT,INSERT 的 DETAIL 会指出列名,身份列分支还带 HINT Use OVERRIDING SYSTEM VALUE to override.

UPDATE 的检查覆盖 GENERATED ALWAYS 身份列和所有生成列,只要目标项是非默认值就报错;UPDATE 没有 OVERRIDING 例外。检查之后,虚拟生成列在重写目标中放入 NULL,存储生成列由执行器填充。这是 18.6 固定源码的存储路径;目录中“10.0 已知存在”只是 SQLSTATE 定义下界,不能据此声称 10.0 已具备所有生成列特性。

诊断

检查 pg_attribute.attidentitya 表示 ALWAYSd 表示 BY DEFAULT)和 attgenerateds 表示存储、v 表示虚拟),确认是 INSERT 还是 UPDATE,以及目标项是省略、DEFAULT 还是实际值。VALUES 来源还要确认对应行项是否确实为 DEFAULT;重写器有单独的全默认判断。身份列与生成列的 INSERT 可能共用主消息,需同时读取 DETAIL/HINT。

处理

GENERATED ALWAYS 身份列省略赋值、使用 DEFAULT,或仅在业务明确拥有身份值时使用 OVERRIDING SYSTEM VALUEBY DEFAULT 身份列可按业务保留显式值;需要服务器生成时用 OVERRIDING USER VALUE。生成列移除赋值,不要用类型转换绕过检查。若 ERROR 发生在显式事务中,应回滚到合适保存点或回滚事务后再发修正语句;本页没有运行时恢复观察。

消息变体

选定的 18.6 分支均为 ERROR

操作 主消息 DETAIL HINT
GENERATED ALWAYS 身份列 INSERT cannot insert a non-DEFAULT value into column "%s" Column "%s" is an identity column defined as GENERATED ALWAYS. Use OVERRIDING SYSTEM VALUE to override.
生成列 INSERT cannot insert a non-DEFAULT value into column "%s" Column "%s" is a generated column.
GENERATED ALWAYS 身份列 UPDATE column "%s" can only be updated to DEFAULT Column "%s" is an identity column defined as GENERATED ALWAYS.
生成列 UPDATE column "%s" can only be updated to DEFAULT Column "%s" is a generated column.

固定源码还区分虚拟生成列的 NULL 目标项与存储生成列的执行器填充。每个 %s 都是动态字段,本页不声称具体占位符值或运行时结果。

报文模板

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

主消息 cannot insert a non-DEFAULT value into column "%s"
DETAIL Column "%s" is an identity column defined as GENERATED ALWAYS.
HINT Use OVERRIDING SYSTEM VALUE to override.
主消息 · errdetail Column "%s" is an identity column defined as GENERATED ALWAYS.
主消息 · errhint Use OVERRIDING SYSTEM VALUE to override.

来源:src/backend/rewrite/rewriteHandler.c(lines 942-948) @ REL_18_6

适用范围:Placeholders remain dynamic source fields; no concrete runtime value is claimed.

主消息 cannot insert a non-DEFAULT value into column "%s"
DETAIL Column "%s" is a generated column.
主消息 · errdetail Column "%s" is a generated column.

来源:src/backend/rewrite/rewriteHandler.c(lines 981-986) @ REL_18_6

适用范围:Placeholders remain dynamic source fields; no concrete runtime value is claimed.

主消息 column "%s" can only be updated to DEFAULT
DETAIL Column "%s" is an identity column defined as GENERATED ALWAYS.
主消息 · errdetail Column "%s" is an identity column defined as GENERATED ALWAYS.

来源:src/backend/rewrite/rewriteHandler.c(lines 1008-1013) @ REL_18_6

适用范围:Placeholders remain dynamic source fields; no concrete runtime value is claimed.

主消息 column "%s" can only be updated to DEFAULT
DETAIL Column "%s" is a generated column.
主消息 · errdetail Column "%s" is a generated column.

来源:src/backend/rewrite/rewriteHandler.c(lines 1015-1030) @ REL_18_6

适用范围:Placeholders remain dynamic source fields; no concrete runtime value is claimed.

版本

目录记录该条件自 10.0 起存在,并锁定到 18.6、19beta3;这是定义下界,不是身份列、存储生成列和虚拟生成列共同的功能引入版本。本页机制依据 18.6 固定源码,未运行数据库。

来源

证据

断言

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

  • 428C9 is the generated_always condition in Class 42.

    核实方式Read fixed REL_18_6 errcodes.txt and locked facts.

    不覆盖Identity does not enumerate all source branches or client failures.

    来源src/backend/utils/errcodes.txt(line 355)

  • The fixed rewrite branches compute apply_default for omitted INSERT targets and DEFAULT nodes. GENERATED ALWAYS identity INSERTs reject non-default values unless OVERRIDING SYSTEM VALUE is present; OVERRIDING USER VALUE forces the default, while BY DEFAULT identity accepts a supplied value unless USER VALUE is requested. Generated columns accept only DEFAULT. UPDATE guards reject non-default assignments to GENERATED ALWAYS identity and generated columns; virtual generated columns receive a null target entry and stored generated columns are filled by the executor.

    核实方式Read complete resolved REL_18_6 report groups and message roles.

    不覆盖Representative confirmed core paths only; not exhaustive historical or extension coverage.

    来源src/backend/rewrite/rewriteHandler.c(lines 942-948) · src/backend/rewrite/rewriteHandler.c(lines 981-986) · src/backend/rewrite/rewriteHandler.c(lines 1008-1013) · src/backend/rewrite/rewriteHandler.c(lines 1015-1030)

  • The catalogue records the condition by 10.0 and locks snapshots through 18.6 and 19beta3; this is a definition lower bound, not a shared introduction point for identity, stored-generated, and virtual-generated features. The selected mechanism is fixed 18.6 source and runtime was not run.

    核实方式Read locked catalogue facts and definition snapshots.

    不覆盖First observed release is a lower bound, not precise behavioral introduction.

    来源src/backend/utils/errcodes.txt(line 355)

同类错误代码

Class 42 语法错误或访问规则冲突 下的其他成员。