PostgreSQL 服務器發出的所有消息都賦予了五個字符 的錯誤代碼, 這些代碼遵循 SQL 的 "SQLSTATE" 代碼的習慣。需要知道發生了什麼錯誤條件的應用通常應該測試錯誤代碼, 而不是查看文本錯誤信息。這些錯誤 代碼輕易不會隨着 PostgreSQL 的版本更新而修改, 並且一般也不會隨着錯誤信息的本地化而發生修改。 請注意有些,但不是全部,PostgreSQL 生成的錯誤代碼是由 SQL 標準定義的; 有些標準沒有定義的錯誤條件是我們發明的或者是從其它數據庫借來的。
根據標準,錯誤代碼的頭兩個字符表示錯誤類別,而後三個字符表示在該 類別內特定的條件。 因此,那些不能識別特定錯誤代碼的應用仍然可以從錯誤類別中推斷要做什麼。
Table A-1 裏面列出了 PostgreSQL 8.1 定義的所有錯誤代碼。(有些實際上目前並沒有使用,但是 SQL 標準定義了。) 錯誤類別也列出在此。對於每個錯誤類別都有個"標準"的錯誤代碼, 它的最後三個字符是 000。這個代碼只用於那些落在該類別內, 但是沒有賦予任何更準確的代碼的錯誤條件。
PL/pgSQL 用於每個錯誤代碼的條件名和表中顯示的措辭相同, 只是用下劃線代替了空白。比如,代碼 22012,DIVISION BY ZERO, 它的條件名是 DIVISION_BY_ZERO。條件名可以用大寫或者小寫來寫都可以。 (請注意 PL/pgSQL 並不識別警告,這一點和錯誤,條件名正相反; 那些類別是 00,01,和 02。)
"""
數據庫返回碼
"""
{
# 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 語句尚未結束(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)',
'22P06': '非標準使用逃逸字符(NONSTANDARD USE OF ESCAPE CHARACTER)',
'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)'
}