# 39004 — null_value_not_allowed

> PostgreSQL SQLSTATE 39004 的源码与诊断参考。
---

# 39004

## 速览 {#at-a-glance}

39004 是 SQL Routine Exception 类中的 `null_value_not_allowed`。本页只根据固定定义和有界源码扫描说明定位方法，不把条件名扩展成未经证实的具体调用。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `39004` |
| 条件名 | `null_value_not_allowed` |
| 状态 | `有效` |
| 已知存在于 | `7.4` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED` |
| 别名 | `—` |

<!-- source facts: data/errcodes/39004.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

它表示某个 routine、扩展或其调用边界拒绝了不允许的 NULL。固定 PostgreSQL 18.6 调用归档没有解析出该条件的报告路径，因此不能仅凭 SQLSTATE 判断是参数、返回值、触发器还是其他 routine 约束。

## 诊断 {#diagnosis}

先保存完整 ErrorResponse 的 message、detail、hint、schema、table、column、routine 与位置字段，再按实际 routine 或扩展实现搜索 `ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED`。若代码来自客户端封装或扩展，要检查它实际选择的 SQLSTATE；本页的有界扫描不能替代对部署版本的 wrapper 源码检查。

## 处置 {#response}

修正诊断中指明的 NULL 输入或 routine 契约，并重新核对调用方与实现方的边界。没有具体报告该码的路径时，不要凭条件名改事务策略、盲目重试或声称某个 SQL 语句必然触发它。

## 版本 {#versions}

锁定目录从 7.4 记录该条件，并在列出的正式快照及 19beta3 中出现；这只是定义存在边界，未确认精确引入实现。

## 相关条件 {#related}

[`39000`](../39000/), [`39P01`](../39p01/)

## 来源 {#sources}

详见结构化的[证据记录](../../data/evidence/39004.json)，其中列出固定源码链接、消息模板与范围限制。
