# 42P15 — 无效模式定义

> PostgreSQL SQLSTATE 42P15：来源与诊断参考。
---

# 42P15 — 无效模式定义

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

`42P15`（**invalid_schema_definition**）CREATE SCHEMA 的模式声明不一致时会被拒绝。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `42P15` |
| 条件名 | `invalid_schema_definition` |
| 状态 | `有效` |
| 已知存在于 | `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_INVALID_SCHEMA_DEFINITION` |
| 别名 | `—` |

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

## 含义 {#meaning}

模式定义校验发生在转换 `CREATE SCHEMA` 所包含的对象时。`setSchemaName` helper 会拒绝某个所含对象显式指定的模式名，只要它不同于当前 `CREATE SCHEMA` 正在创建的模式。这是所含对象的声明不一致，不是两个顶层模式，也不是找不到模式。

## 诊断 {#diagnosis}

从消息和完整 `CREATE SCHEMA` 语句中读取两个模式标识符，找出哪个所含的 `CREATE TABLE`、序列、视图或其他对象提供了冲突的限定名。分别检查生成的 DDL 与 `search_path`；改变 `search_path` 不能让语句中明确给出的两个名称一致。

## 处理 {#response}

让 `CREATE SCHEMA` 只使用一个预期名称，让其中对象的显式限定名也使用该名称，或省略由该命令提供上下文的限定名。修正迁移生成器或引用方式。`CREATE SCHEMA` 失败本身不能证明已经提交了部分模式；只有需要清理或外层事务已有状态时才检查目录。如果 ERROR 发生在显式事务中，重试前先 `ROLLBACK` 或回滚到错误前的保存点。

## 消息 {#messages}

固定源码中的代表性消息包括：message: `CREATE specifies a schema (%s) different from the one being created (%s)`。占位符由实际对象、列或参数填充。

## 版本 {#versions}

锁定目录显示该条件最早见于 PostgreSQL 7.4；行为说明固定在 PostgreSQL 18.6 源码，目录存在范围不等于每条消息或功能都从该版本开始。

## 相关 {#related}

- [`3F000`](../3f000/)
- [`42P06`](../42p06/)

## 来源 {#sources}

源码消息、行号和证据边界见 [作者证据](../../data/evidence/42p15.json)。

- `src/backend/parser/parse_utilcmd.c:4229-4233` ([fixed source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/parse_utilcmd.c#L4229-L4233))
