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

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

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

428C9 generated_always

GENERATED ALWAYS 列赋值

ERROR 源码确认 详解 未实测

条件名
generated_always
宏名称
ERRCODE_GENERATED_ALWAYS
最早已知存在
10.0
状态
有效

版本覆盖

  1. 18
  2. 17
  3. 16
  4. 15
  5. 14
  1. 13
  2. 12
  3. 11
  4. 10
  5. 9.6
  6. 9.5
  7. 9.4
  8. 9.3
  9. 9.2
  10. 9.1
  11. 9.0
  1. 19 beta
  2. 20 dev

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

速览

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"
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 固定源码,未运行数据库。

来源

证据

断言

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

同类 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 起已知
操作需要唯一排序规则,但无法确定。 有效