PostgreSQL 服务器发出的所有消息都分配了五字符错误代码,遵循 SQL 标准中用于 “SQLSTATE” 代码的惯例。需要了解已发生哪种错误情况的应用程序通常应测试错误代码,而不是查看文本错误消息。错误代码在 PostgreSQL 版本中不太可能发生变化,而且也不会因为错误消息本地化而发生变化。请注意,PostgreSQL 产生的部分(但不是全部)错误代码是由 SQL 标准定义的;已经发明了一些其他错误代码用于标准未定义的情况,或从其他数据库借用这些代码。
根据该标准,错误代码的前两个字符表示一个错误类型,而后三个字符表示该类型中的特定情况。因此,不识别特定错误代码的应用程序可能仍然能够从错误类型推断出该做什么。
表 A.1 列出了 PostgreSQL 17.1 中定义的所有错误代码。(目前有些代码并未实际使用,但已在 SQL 标准中定义了。)错误类型也会显示。对于每个错误类型,都有一个 “标准” 错误代码,最后三个字符是 000
。此代码仅用于属于该类型的错误情况,但尚未分配更具体的代码的情况。
“情况名称” 列中显示的符号是可在 PL/pgSQL 中使用的条件名称。条件名称可以大写或小写书写。(请注意,PL/pgSQL 不识别警告(而不是错误)条件名称;这些名称属于 00、01 和 02 类。)
对于某些类型的错误,服务器将报告与错误关联的数据库对象(表、表列、数据类型或约束)的名称;例如,导致 unique_violation
错误的唯一约束的名称。此类名称会提供给错误报告消息的单独字段,因此,应用程序不必试图从消息(可能是经过本地化的易读文本)中提取它们。自 PostgreSQL 9.3 版本起,此功能已完全覆盖 SQLSTATE 类 23 中的错误(完整性约束冲突),但这可能会在将来得到扩展。
表 A.1. PostgreSQL 错误代码
错误代码 | 条件名称 |
---|---|
类 00 — 成功完成 | |
00000 |
successful_completion |
类 01 — 警告 | |
01000 |
warning |
0100C |
dynamic_result_sets_returned |
01008 |
implicit_zero_bit_padding |
01003 |
null_value_eliminated_in_set_function |
01007 |
privilege_not_granted |
01006 |
privilege_not_revoked |
01004 |
string_data_right_truncation |
01P01 |
deprecated_feature |
类 02 — 无数据(这按 SQL 标准也是一个警告类) | |
02000 |
no_data |
02001 |
no_additional_dynamic_result_sets_returned |
类 03 — SQL 语句尚未完成 | |
03000 |
sql_statement_not_yet_complete |
类 08 — 连接异常 | |
08000 |
connection_exception |
08003 |
connection_does_not_exist |
08006 |
connection_failure |
08001 |
sqlclient_unable_to_establish_sqlconnection |
08004 |
sqlserver_rejected_establishment_of_sqlconnection |
08007 |
transaction_resolution_unknown |
08P01 |
protocol_violation |
类 09 — 触发器操作异常 | |
09000 |
triggered_action_exception |
类 0A — 不支持的功能 | |
0A000 |
feature_not_supported |
类 0B — 无效的事务初始化 | |
0B000 |
invalid_transaction_initiation |
类 0F — 定位符异常 | |
0F000 |
locator_exception |
0F001 |
invalid_locator_specification |
类 0L — 无效的授予者 | |
0L000 |
invalid_grantor |
0LP01 |
invalid_grant_operation |
类 0P — 无效的角色规范 | |
0P000 |
invalid_role_specification |
类 0Z — 诊断异常 | |
0Z000 |
diagnostics_exception |
0Z002 |
stacked_diagnostics_accessed_without_active_handler |
类 20 — 找不到案例 | |
20000 |
case_not_found |
类 21 — 基数违规 | |
21000 |
cardinality_violation |
类 22 — 数据异常 | |
22000 |
data_exception |
2202E |
array_subscript_error |
22021 |
character_not_in_repertoire |
22008 |
datetime_field_overflow |
22012 |
division_by_zero |
22005 |
error_in_assignment |
2200B |
escape_character_conflict |
22022 |
indicator_overflow |
22015 |
interval_field_overflow |
2201E |
invalid_argument_for_logarithm |
22014 |
invalid_argument_for_ntile_function |
22016 |
invalid_argument_for_nth_value_function |
2201F |
invalid_argument_for_power_function |
2201G |
invalid_argument_for_width_bucket_function |
22018 |
invalid_character_value_for_cast |
22007 |
invalid_datetime_format |
22019 |
invalid_escape_character |
2200D |
invalid_escape_octet |
22025 |
invalid_escape_sequence |
22P06 |
nonstandard_use_of_escape_character |
22010 |
invalid_indicator_parameter_value |
22023 |
无效参数值 |
22013 |
无效的前置或后置大小 |
2201B |
无效的正则表达式 |
2201W |
limit 子句中的无效行计数 |
2201X |
result offset 子句中的无效行计数 |
2202H |
无效的 tablesample 参数 |
2202G |
无效的 tablesample 重复 |
22009 |
无效的时区位移值 |
2200C |
无效的转义字符使用 |
2200G |
最具体类型不匹配 |
22004 |
不允许空值 |
22002 |
空值没有指示符参数 |
22003 |
数值超出范围 |
2200H |
序列生成器限制超限 |
22026 |
字符串数据长度不匹配 |
22001 |
string_data_right_truncation |
22011 |
子字符串错误 |
22027 |
trim 错误 |
22024 |
未终止的 C 字符串 |
2200F |
零长度的字符字符串 |
22P01 |
浮点异常 |
22P02 |
无效文本表示 |
22P03 |
无效二进制表示 |
22P04 |
copy 文件格式错误 |
22P05 |
不可翻译的字符 |
2200L |
不是 XML 文档 |
2200M |
无效的 XML 文档 |
2200N |
无效的 XML 内容 |
2200S |
无效的 XML 注释 |
2200T |
无效的 XML 处理指令 |
22030 |
重复的 JSON 对象键值对 |
22031 |
无效的 SQL JSON 日期时间函数参数 |
22032 |
无效的 JSON 文本 |
22033 |
无效的 SQL JSON 下标 |
22034 |
超过一个 SQL JSON 项 |
22035 |
没有 SQL JSON 项 |
22036 |
非数字 SQL JSON 项 |
22037 |
JSON 对象中非唯一的键 |
22038 |
必需的单例 SQL JSON 项 |
22039 |
未找到 SQL JSON 数组 |
2203A |
未找到 SQL JSON 成员 |
2203B |
未找到 SQL JSON 数字 |
2203C |
未找到 SQL JSON 对象 |
2203D |
JSON 数组元素过多 |
2203E |
JSON 对象成员过多 |
2203F |
必需的 SQL JSON 标量 |
2203G |
无法将 SQL JSON 项转换为目标类型 |
23 类 - 完整性约束违规 | |
23000 |
完整性约束违规 |
23001 |
限制违规 |
23502 |
非空违规 |
23503 |
外键违规 |
23505 |
唯一违规 |
23514 |
检查违规 |
23P01 |
排除违规 |
24 类 - 无效游标状态 | |
24000 |
无效游标状态 |
25 类 - 无效事务状态 | |
25000 |
无效的事务状态 |
25001 |
活动 SQL 事务 |
25002 |
分支事务已激活 |
25008 |
hold 的游标要求相同的隔离级别 |
25003 |
分支事务的访问模式不适当 |
25004 |
分支事务的隔离级别不适当 |
25005 |
分支事务没有活动 SQL 事务 |
25006 |
只读 SQL 事务 |
25007 |
不支持模式和数据语句混合 |
25P01 |
没有活动 SQL 事务 |
25P02 |
失败的 SQL 事务中 |
25P03 |
事务会话超时期间闲置 |
25P04 |
事务超时 |
26 类 - 无效的 SQL 语句名称 | |
26000 |
无效的 SQL 语句名称 |
27 类 - 触发数据更改违规 | |
27000 |
触发的更改违规 |
28 类 - 无效授权规范 | |
28000 |
无效的授权规范 |
28P01 |
无效的密码 |
2B 类 - 仍存在依赖的权限描述符 | |
2B000 |
仍存在依赖的权限描述符 |
2BP01 |
仍存在依赖的对象 |
2D 类 - 无效的事务终止 | |
2D000 |
无效事务终止 |
类 2F — SQL 例程异常 | |
2F000 |
sql 例程异常 |
2F005 |
函数执行无返回语句 |
2F002 |
修改 SQL 数据不可用 |
2F003 |
尝试调用非法 SQL 语句 |
2F004 |
读取 SQL 数据不可用 |
类 34 — 无效游标名称 | |
34000 |
无效游标名称 |
类 38 — 外部例程异常 | |
38000 |
外部例程异常 |
38001 |
不允许包含 SQL |
38002 |
修改 SQL 数据不可用 |
38003 |
尝试调用非法 SQL 语句 |
38004 |
读取 SQL 数据不可用 |
类 39 — 外部例程调用异常 | |
39000 |
外部例程调用异常 |
39001 |
返回无效 SQL 状态 |
39004 |
不允许空值 |
39P01 |
触发器协议被违反 |
39P02 |
SRF 协议被违反 |
39P03 |
事件触发器协议被违反 |
类 3B — 保存点异常 | |
3B000 |
保存点异常 |
3B001 |
无效保存点规范 |
类 3D — 无效目录名称 | |
3D000 |
无效目录名称 |
类 3F — 无效架构名称 | |
3F000 |
无效架构名称 |
类 40 — 事务回滚 | |
40000 |
事务回滚 |
40002 |
事务完整性约束违反 |
40001 |
序列化失败 |
40003 |
语句完成未知 |
40P01 |
检测到死锁 |
类 42 — 语法错误或访问规则违反 | |
42000 |
语法错误或访问规则违反 |
42601 |
语法错误 |
42501 |
特权不足 |
42846 |
无法强制转换 |
42803 |
分组错误 |
42P20 |
窗体错误 |
42P19 |
无效递归 |
42830 |
无效外键 |
42602 |
无效名称 |
42622 |
名称过长 |
42939 |
保留名称 |
42804 |
数据类型不匹配 |
42P18 |
数据类型未确定 |
42P21 |
校对不匹配 |
42P22 |
校对未确定 |
42809 |
对象类型错误 |
428C9 |
总是生成的 |
42703 |
未定义的列 |
42883 |
未定义的函数 |
42P01 |
未定义的表 |
42P02 |
未定义的参数 |
42704 |
未定义的对象 |
42701 |
重复的列 |
42P03 |
重复的游标 |
42P04 |
重复的数据库 |
42723 |
重复的函数 |
42P05 |
重复的预备语句 |
42P06 |
重复的架构 |
42P07 |
重复的表 |
42712 |
重复的别名 |
42710 |
重复的对象 |
42702 |
不确定的列 |
42725 |
不确定的函数 |
42P08 |
不确定的参数 |
42P09 |
不确定的别名 |
42P10 |
无效列引用 |
42611 |
无效列定义 |
42P11 |
无效游标定义 |
42P12 |
无效数据库定义 |
42P13 |
无效函数定义 |
42P14 |
无效预备语句定义 |
42P15 |
无效架构定义 |
42P16 |
无效表定义 |
42P17 |
无效对象定义 |
44 类 — 外检选项冲突 | |
44000 |
外部检查选项冲突 |
53 类 — 资源不足 | |
53000 |
资源不足 |
53100 |
磁盘空间已满 |
53200 |
内存不足 |
53300 |
连接过多 |
53400 |
配置限制已达上限 |
54 类 — 程序限制已达上限 | |
54000 |
程序限制已达上限 |
54001 |
语句过于复杂 |
54011 |
列过多 |
54023 |
参数过多 |
55 类 — 对象不在先决条件状态 | |
55000 |
对象不在先决条件状态 |
55006 |
对象正在使用中 |
55P02 |
无法更改运行时参数 |
55P03 |
锁不可用 |
55P04 |
不安全的枚举值用法 |
57 类 — 操作员干预 | |
57000 |
操作员干预 |
57014 |
取消查询 |
57P01 |
管理员已关闭 |
57P02 |
崩溃关闭 |
57P03 |
当前无法连接 |
57P04 |
数据库已删除 |
57P05 |
空闲会话超时 |
58 类 — 系统错误(外部错误 PostgreSQL 本身) | |
58000 |
系统错误 |
58030 |
输入/输出错误 |
58P01 |
文件未定义 |
58P02 |
重复文件 |
F0 类 — 配置文件错误 | |
F0000 |
配置文件错误 |
F0001 |
锁文件已存在 |
HV 类 — 外部数据包错误 (SQL/MED) | |
HV000 |
FDW 错误 |
HV005 |
未找到 FDW 列名称 |
HV002 |
需要 FDW 动态参数值 |
HV010 |
FDW 函数序列错误 |
HV021 |
FDW 描述符信息不一致 |
HV024 |
无效的 FDW 属性值 |
HV007 |
无效 FDW 列名称 |
HV008 |
无效 FDW 列数 |
HV004 |
无效的 FDW 数据类型 |
HV006 |
无效 FDW 数据类型描述符 |
HV091 |
无效的 FDW 描述符字段标识符 |
HV00B |
无效的 FDW 句柄 |
HV00C |
无效的 FDW 选项索引 |
HV00D |
无效的 FDW 选项名称 |
HV090 |
无效的 FDW 字符串长度或缓冲区长度 |
HV00A |
无效的 FDW 字符串格式 |
HV009 |
使用空指针不当 |
HV014 |
FDW 句柄过多 |
HV001 |
FDW 内存不足 |
HV00P |
FDW 没有架构 |
HV00J |
未找到 FDW 选项名称 |
HV00K |
FDW 答复句柄 |
HV00Q |
未找到 FDW 架构 |
HV00R |
未找到 FDW 表 |
HV00L |
无法创建 FDW 执行 |
HV00M |
无法创建 FDW 答复 |
HV00N |
无法建立 FDW 连接 |
P0 类 — PL/pgSQL 错误 | |
P0000 |
plpgsql 错误 |
P0001 |
引发异常 |
P0002 |
未找到数据 |
P0003 |
行过多 |
P0004 |
断言失败 |
XX 类 — 内部错误 | |
XX000 |
内部错误 |
XX001 |
数据已损坏 |
XX002 |
索引已损坏 |