百科 / 错误代码 / Class 42 语法错误或访问规则冲突
428C9 generated_always
GENERATED ALWAYS 列赋值
ERROR 源码确认 详解 未实测
- 条件名
generated_always- 宏名称
ERRCODE_GENERATED_ALWAYS- 启用版本
- 10
- 状态
- 活跃
版本覆盖
速览
428C9(generated_always)是重写阶段的 ERROR:INSERT 或 UPDATE 向必须由服务器生成或只接受 DEFAULT 的列提供了值。身份列和生成列的赋值规则不同,必须结合操作类型和列元数据判断。
含义
重写器会把 INSERT 中省略的目标列或显式 DEFAULT 标为 apply_default。GENERATED 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.attidentity(a 表示 ALWAYS、d 表示 BY DEFAULT)和 attgenerated(s 表示存储、v 表示虚拟),确认是 INSERT 还是 UPDATE,以及目标项是省略、DEFAULT 还是实际值。VALUES 来源还要确认对应行项是否确实为 DEFAULT;重写器有单独的全默认判断。身份列与生成列的 INSERT 可能共用主消息,需同时读取 DETAIL/HINT。
处理
GENERATED ALWAYS 身份列省略赋值、使用 DEFAULT,或仅在业务明确拥有身份值时使用 OVERRIDING SYSTEM VALUE。BY 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"
Column "%s" is an identity column defined as GENERATED ALWAYS.
Use OVERRIDING SYSTEM VALUE to override.
Column "%s" is an identity column defined as GENERATED ALWAYS.
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"
Column "%s" is a generated column.
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
Column "%s" is an identity column defined as GENERATED ALWAYS.
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
Column "%s" is a generated column.
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 固定源码,未运行数据库。
来源
- 上游源码 src/backend/rewrite/rewriteHandler.c 第 942–948 行
- 上游源码 src/backend/rewrite/rewriteHandler.c 第 981–986 行
- 上游源码 src/backend/rewrite/rewriteHandler.c 第 1008–1013 行
- 上游源码 src/backend/rewrite/rewriteHandler.c 第 1015–1030 行
- 上游源码 src/backend/utils/errcodes.txt 第 355 行
- 核验材料 raw/calls/REL_18_6.jsonl
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
428C9 is the generated_always condition in Class 42.
-
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.
-
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.
同类错误代码
Class 42 语法错误或访问规则冲突 下的其他成员。
42000syntax_error_or_access_rule_violation42501insufficient_privilege42601syntax_error42602invalid_name42611invalid_column_definition42622name_too_long42701duplicate_column42702ambiguous_column42703undefined_column42704undefined_object42710duplicate_object42712duplicate_alias42723duplicate_function42725ambiguous_function42803grouping_error42804datatype_mismatch42809wrong_object_type42830invalid_foreign_key42846cannot_coerce42883undefined_function42939reserved_name42P01undefined_table42P02undefined_parameter42P03duplicate_cursor42P04duplicate_database42P05duplicate_prepared_statement42P06duplicate_schema42P07duplicate_table42P08ambiguous_parameter42P09ambiguous_alias42P10invalid_column_reference42P11invalid_cursor_definition42P12invalid_database_definition42P13invalid_function_definition42P14invalid_prepared_statement_definition42P15invalid_schema_definition42P16invalid_table_definition42P17invalid_object_definition42P18indeterminate_datatype42P19invalid_recursion42P20windowing_error42P21collation_mismatch42P22indeterminate_collation