PostgreSQL 服务器发出的所有消息都赋予了五个字符 的错误代码, 这些代码遵循 SQL 的 "SQLSTATE" 代码的习惯。需要知道发生了什么错误条件的应用通常应该测试错误代码, 而不是查看文本错误信息。这些错误 代码轻易不会随着 PostgreSQL 的版本更新而修改, 并且一般也不会随着错误信息的本地化而发生修改。 请注意有些,但不是全部,PostgreSQL 生成的错误代码是由 SQL 标准定义的; 有些标准没有定义的错误条件是我们发明的或者是从其它数据库借来的。
根据标准,错误代码的头两个字符表示错误类别,而后三个字符表示在该 类别内特定的条件。 因此,那些不能识别特定错误代码的应用仍然可以从错误类别中推断要做什么。
Table A-1 里面列出了 PostgreSQL 8.0.0 定义的所有错误代码。(有些实际上目前并没有使用,但是 SQL 标准定义了。) 错误类别也列出在此。对于每个错误类别都有个"标准"的错误代码, 它的最后三个字符是 000。这个代码只用于那些落在该类别内, 但是没有赋予任何更准确的代码的错误条件。
PL/pgSQL 用于每个错误代码的条件名和表中显示的措辞相同, 只是用下划线代替了空白。比如,代码 22012,DIVISION BY ZERO, 它的条件名是 DIVISION_BY_ZERO。条件名可以用大写或者小写来写都可以。 (请注意 PL/pgSQL 并不识别警告,这一点和错误,条件名正相反; 那些类别是 00,01,和 02。)
Table 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:1999 的要求,这也是警告类
02000 没有数据(NO DATA)
02001 返回了没有附加动态结果集(NO ADDITIONAL DYNAMIC RESULT SETS RETURNED)
03 类 SQL 语句尚未结束
03000 SQL 语句尚未结束(SQL STATEMENT NOT YET COMPLETE)
08 类 连接例外
08000 连接例外(CONNECTION EXCEPTION)
08003 连接不存在(CONNECTION DOES NOT EXIST)
08006 连接失败(CONNECTION FAILURE)
08001 SQL 客户端不能建立 SQL 连接(SQLCLIENT UNABLE TO ESTABLISH SQLCONNECTION)
08004 SQL 服务器拒绝建立 SQL 连接(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)
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)
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)
22010 非法指示器参数值(INVALID INDICATOR PARAMETER VALUE)
22020 非法限制值(INVALID LIMIT VALUE)
22023 非法参数值(INVALID PARAMETER VALUE)
2201B 非法正则表达式(INVALID REGULAR EXPRESSION)
22009 非法时区显示值(INVALID TIME ZONE DISPLACEMENT VALUE)
2200C 非法使用逃逸字符(INVALID USE OF ESCAPE CHARACTER)
2200G 最相关类型不匹配(MOST SPECIFIC TYPE MISMATCH)
22004 不允许 NULL 值(NULL VALUE NOT ALLOWED)
22002 NULL 值不能做指示器参数(NULL VALUE NO INDICATOR PARAMETER)
22003 数字值超出范围(NUMERIC VALUE OUT OF RANGE)
22026 字串数据长度不匹配(STRING DATA LENGTH MISMATCH)
22001 字串数据右边被截断(STRING DATA RIGHT TRUNCATION)
22011 抽取子字串错误(SUBSTRING ERROR)
22027 截断错误(TRIM ERROR)
22024 未结束的 C 字串(UNTERMINATED C STRING)
2200F 零长度的字符串(ZERO LENGTH CHARACTER STRING)
22P01 浮点例外(FLOATING POINT EXCEPTION)
22P02 非法文本表现形式(INVALID TEXT REPRESENTATION)
22P03 非法二进制表现形式(INVALID BINARY REPRESENTATION)
22P04 错误的 COPY 格式(BAD COPY FILE FORMAT)
22P05 不可翻译字符(UNTRANSLATABLE CHARACTER)
23 类 违反完整性约束
23000 违反完整性约束(INTEGRITY CONSTRAINT VIOLATION)
23001 违反限制(RESTRICT VIOLATION)
23502 违反非空(NOT NULL VIOLATION)
23503 违反外键约束(FOREIGN KEY VIOLATION)
23505 违反唯一约束(UNIQUE VIOLATION)
23514 违反检查(CHECK VIOLATION)
24 类 非法游标状态
24000 非法游标状态(INVALID CURSOR STATE)
25 类 非法事务状态
25000 非法事务状态(INVALID TRANSACTION STATE)
25001 活跃的 SQL 状态(ACTIVE SQL TRANSACTION)
25002 分支事务已经激活(BRANCH TRANSACTION ALREADY ACTIVE)
25008 持有的游标要求同样的隔离级别(HELD CURSOR REQUIRES SAME ISOLATION LEVEL)
25003 对分支事务的不恰当的访问方式(INAPPROPRIATE ACCESS MODE FOR BRANCH TRANSACTION)
25004 对分支事务的不恰当的隔离级别(INAPPROPRIATE ISOLATION LEVEL FOR BRANCH TRANSACTION)
25005 分支事务没有活跃的 SQL 事务(NO ACTIVE SQL TRANSACTION FOR BRANCH TRANSACTION)
25006 只读的 SQL 事务(READ ONLY SQL TRANSACTION)
25007 不支持混和的模式和数据语句(SCHEMA AND DATA STATEMENT MIXING NOT SUPPORTED)
25P01 没有活跃的 SQL 事务(NO ACTIVE SQL TRANSACTION)
25P02 在失败的 SQL 事务中(IN FAILED SQL TRANSACTION)
26 类 非法 SQL 语句名
26000 非法 SQL 语句名(INVALID SQL STATEMENT NAME)
27 类 触发的数据改变违规
27000 触发的数据改变违规(TRIGGERED DATA CHANGE VIOLATION)
28 类 非法授权声明
28000 非法授权声明(INVALID AUTHORIZATION SPECIFICATION)
2B 类 依然存在依赖的优先级描述符
2B000 依然存在依赖的优先级描述符(DEPENDENT PRIVILEGE DESCRIPTORS STILL EXIST)
2BP01 依赖性对象仍然存在(DEPENDENT OBJECTS STILL EXIST)
2D 类 非法的事务终止
2D000 非法的事务终止(INVALID TRANSACTION TERMINATION)
2F 类 SQL 过程例外
2F000 SQL 过程例外(SQL ROUTINE EXCEPTION)
2F005 执行的函数没有返回语句(FUNCTION EXECUTED NO RETURN STATEMENT)
2F002 不允许修改 SQL 数据(MODIFYING SQL DATA NOT PERMITTED)
2F003 企图使用禁止的 SQL 语句(PROHIBITED SQL STATEMENT ATTEMPTED)
2F004 不允许读取 SQL 数据(READING SQL DATA NOT PERMITTED)
34 类 非法游标名
34000 非法游标名(INVALID CURSOR NAME)
38 类 外部过程例外
38000 外部过程例外(EXTERNAL ROUTINE EXCEPTION)
38001 不允许包含的 SQL (CONTAINING SQL NOT PERMITTED)
38002 不允许修改 SQL 数据(MODIFYING SQL DATA NOT PERMITTED)
38003 企图使用禁止的 SQL 语句(PROHIBITED SQL STATEMENT ATTEMPTED)
38004 不允许读取 SQL 数据(READING SQL DATA NOT PERMITTED)
39 类 外部过程调用例外
39000 外部过程调用例外(EXTERNAL ROUTINE INVOCATION EXCEPTION)
39001 返回了非法的 SQLSTATE(INVALID SQLSTATE RETURNED)
39004 不允许空值(NULL VALUE NOT ALLOWED)
39P01 违反触发器协议(TRIGGER PROTOCOL VIOLATED)
39P02 违反SRF协议(SRF PROTOCOL VIOLATED)
3B 类 保存点例外
3B000 保存点例外(SAVEPOINT EXCEPTION)
3B001 无效的保存点声明(INVALID SAVEPOINT SPECIFICATION)
3D 类 非法数据库名
3D000 非法数据库名(INVALID CATALOG NAME)
3F 类 非法模式名
3F000 非法模式名(INVALID SCHEMA NAME)
40 类 事务回滚
40000 事务回滚(TRANSACTION ROLLBACK)
40002 违反事务完整性约束(TRANSACTION INTEGRITY CONSTRAINT VIOLATION)
40001 串行化失败(SERIALIZATION FAILURE)
40003 不知道语句是否结束(STATEMENT COMPLETION UNKNOWN)
40P01 侦测到死锁(DEADLOCK DETECTED)
42 类 语法错误或者违反访问规则
42000 语法错误或者违反访问规则(SYNTAX ERROR OR ACCESS RULE VIOLATION)
42601 语法错误(SYNTAX ERROR)
42501 权限不够(INSUFFICIENT PRIVILEGE)
42846 无法进行类型转换(CANNOT COERCE)
42803 分组错误(GROUPING ERROR)
42830 非法的外键(INVALID FOREIGN KEY)
42602 非法名字(INVALID NAME)
42622 名字太长(NAME TOO LONG)
42939 保留名字(RESERVED NAME)
42804 数据类型不匹配(DATATYPE MISMATCH)
42P18 未决的数据类型(INDETERMINATE DATATYPE)
42809 错误的对象类型(WRONG OBJECT TYPE)
42703 未定义的字段(UNDEFINED COLUMN)
42883 未定义的函数(UNDEFINED FUNCTION)
42P01 未定义的表(UNDEFINED TABLE)
42P02 未定义的参数(UNDEFINED PARAMETER)
42704 未定义对象(UNDEFINED OBJECT)
42701 重复的字段(DUPLICATE COLUMN)
42P03 重复的游标(DUPLICATE CURSOR)
42P04 重复的数据库(DUPLICATE DATABASE))
42723 重复的函数(DUPLICATE FUNCTION)
42P05 重复的准备好语句(DUPLICATE PREPARED STATEMENT)
42P06 重复的模式(DUPLICATE SCHEMA)
42P07 重复的表(DUPLICATE TABLE)
42712 重复的别名(DUPLICATE ALIAS)
42710 重复的对象(DUPLICATE OBJECT)
42702 模糊的字段(AMBIGUOUS COLUMN)
42725 模糊的函数(AMBIGUOUS FUNCTION)
42P08 模糊的参数(AMBIGUOUS PARAMETER)
42P09 模糊的别名(AMBIGUOUS ALIAS)
42P10 非法字段引用(INVALID COLUMN REFERENCE)
42611 非法字段定义(INVALID COLUMN DEFINITION)
42P11 非法游标定义(INVALID CURSOR DEFINITION)
42P12 非法的数据库定义(INVALID DATABASE DEFINITION)
42P13 非法函数定义(INVALID FUNCTION DEFINITION)
42P14 非法准备好语句定义(INVALID PREPARED STATEMENT DEFINITION)
42P15 非法模式定义(INVALID SCHEMA DEFINITION)
42P16 非法表定义(INVALID TABLE DEFINITION)
42P17 非法对象定义(INVALID OBJECT DEFINITION)
44 类 违反 WITH CHECK 选项
44000 违反 WITH CHECK 选项(WITH CHECK OPTION VIOLATION)
53 类 资源不够
53000 资源不够(INSUFFICIENT RESOURCES)
53100 磁盘满(DISK FULL)
53200 内存耗尽(OUT OF MEMORY)
53300 太多连接(TOO MANY CONNECTIONS)
54 类 超过程序限制
54000 超过程序限制(PROGRAM LIMIT EXCEEDED)
54001 语句太复杂(STATEMENT TOO COMPLEX)
54011 太多字段(TOO MANY COLUMNS)
54023 参数太多(TOO MANY ARGUMENTS)
55 类 对象不在预先要求的状态
55000 对象不在预先要求的状态(OBJECT NOT IN PREREQUISITE STATE)
55006 对象在使用中(OBJECT IN USE)
55P02 无法修改运行时参数(CANT CHANGE RUNTIME PARAM)
55P03 锁不可获得(LOCK NOT AVAILABLE)
57 类 操作者干涉
57000 操作者干涉(OPERATOR INTERVENTION)
57014 查询被取消(QUERY CANCELED)
57P01 管理员关机(ADMIN SHUTDOWN)
57P02 崩溃关机(CRASH SHUTDOWN)
57P03 现在无法连接(CANNOT CONNECT NOW)
58 类 系统错误( PostgreSQL 自己内部的错误)
58030 IO 错误(IO ERROR)
58P01 未定义的文件(UNDEFINED FILE)
58P02 重复的文件(DUPLICATE FILE)
F0 类 配置文件错误
F0000 配置文件错误(CONFIG FILE ERROR)
F0001 锁文件存在(LOCK FILE EXISTS)
P0 类 PL/pgSQL 错误
P0000 PLPGSQL 错误(PLPGSQL ERROR)
P0001 抛出例外(RAISE EXCEPTION)
XX 类 内部错误
XX000 内部错误(INTERNAL ERROR)
XX001 数据损坏(DATA CORRUPTED)
XX002 索引损坏(INDEX CORRUPTED)