PostgreSQL Field Guide

SQLSTATE 错误速查

用稳定的五字符状态码诊断约束、事务、权限、资源和连接问题

应用应分支处理 SQLSTATE,不要匹配可能随版本和语言变化的错误文本。

高频状态码

SQLSTATE名称常见含义稳妥动作
23505unique_violation唯一键冲突返回冲突或使用明确的 ON CONFLICT 语义
23503foreign_key_violation引用不存在/仍被引用修正操作顺序,不要临时禁用约束
23502not_null_violation必填列缺失修正输入或迁移顺序
23514check_violation违反 CHECK解释业务边界,修正值
22P02invalid_text_representation类型转换失败在应用边界校验并绑定正确类型
40001serialization_failure并发下无法保持隔离保证回滚并重试整个事务
40P01deadlock_detected形成等待环回滚整事务;统一锁顺序
55P03lock_not_availableNOWAIT/lock timeout稍后重试或返回冲突
57014query_canceledstatement timeout 或取消区分主动取消与超时,优化或缩小请求
25P02in_failed_sql_transaction当前事务此前已失败ROLLBACK;不要继续发业务 SQL
42501insufficient_privilege对对象或动作无权限修正 grant/owner;不要提升为 superuser
42P01undefined_table表不存在或 search path 错核对 database/schema/迁移版本
42703undefined_column列不存在核对 schema 契约与部署版本
53300too_many_connections连接槽耗尽检查池配置、泄漏、保留管理连接
57P03cannot_connect_now启动、恢复或关闭中带上限退避,检查实例状态
08006connection_failure连接已失败判断事务结果是否未知,再安全重试

事务失败后的规则

事务内任意语句失败后,通常进入 aborted 状态:

ERROR: current transaction is aborted...
SQLSTATE: 25P02

必须 ROLLBACK,或回滚到失败前创建的 savepoint。不要继续发送语句期待自动恢复。

重试分类

  • 可整事务重试4000140P01;使用次数上限、指数退避和 jitter。
  • 可能短暂重试55P0357P03、部分 08***;先确认幂等和事务提交状态。
  • 输入/模型错误,不应盲重试22***23***42***42501
  • 资源问题53300、磁盘满、内存问题;重试会放大故障,先降载和修复容量。

诊断上下文

记录 SQLSTATE、约束/表/列名、数据库与 schema、应用版本、迁移版本、事务 ID/请求 ID、参数类型(敏感值脱敏)和是否已提交。驱动通常提供结构化错误字段,应直接读取。

AI 工具的返回

{
  "ok": false,
  "sqlstate": "23505",
  "category": "constraint",
  "retryable": false,
  "constraint": "customers_email_unique",
  "message_safe": "A customer with this email already exists"
}

不要把原始数据库错误无过滤地返回终端用户;它可能泄露对象名、路径或数据片段。

Last updated on

On this page