# 42P06 — 重复模式

> PostgreSQL SQLSTATE 42P06（duplicate_schema）的来源与诊断参考。
---

# 42P06 — 重复模式

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

`42P06`（**duplicate_schema**）是模式定义冲突。普通 CREATE 报 ERROR；`IF NOT EXISTS` 可发 NOTICE 并继续，但条件路径只是跳过创建，不会协调已有模式。

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

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

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

## 含义 {#meaning}

`NamespaceCreate` 发现 `pg_namespace` 中已有同名行时报告 ERROR `schema "%s" already exists`。`CREATE SCHEMA IF NOT EXISTS` 检查同一命名空间后，在创建前报告 NOTICE `schema "%s" already exists, skipping`。两条报文都指向模式本身，不是其中的关系；固定命令路径先做创建权限检查，NOTICE 不表示已经比较了所有者或定义。

## 诊断 {#diagnosis}

确认目标数据库和模式，检查 `pg_namespace.nspname`、所有者/ACL、内容和准确迁移语句。保留严重性：NOTICE 是条件行为并让命令继续，普通 CREATE 的 ERROR 会使显式事务失败。不能从 NOTICE 推出已有模式的所有者、授权、扩展、表或迁移版本符合要求。

## 处理 {#response}

仅在所有权、权限和内容符合业务契约时复用。`IF NOT EXISTS` 不验证也不协调这些属性，需要时应追加明确的所有权、授权和迁移检查。不要删除模式来通过迁移。普通 CREATE 在显式事务中报 ERROR 后，应回滚到合适保存点或回滚事务再继续。

## 消息变体 {#messages}

选定变体是 `schema "%s" already exists`（明确 `ERROR`）和 `schema "%s" already exists, skipping`（明确 `NOTICE`）。`%s` 是动态模式名；两条报文都不保证已有模式的所有者或定义。

## 版本 {#versions}

目录范围从 7.4 到 18.6、19beta3，不是精确的功能引入判断。选定的是 18.6 固定 ERROR 和 NOTICE 源码路径，未运行数据库。

## 相关 {#related}

- [`42P07`](../42p07/)
- [`42P04`](../42p04/)
- [`42939`](../42939/)

## 来源 {#sources}
- `src.errcodes.42P06.18.6` — `src/backend/utils/errcodes.txt` line 382，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt#L382)）。

- `src.call.42P06.4d5505b63e38ef1b25836623` — `src/backend/catalog/pg_namespace.c` lines 62-64，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `89675ba1bb9c531ab4f43db8a6f7cac00956561b342e42ea6eaae6b8d0b50d78`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/catalog/pg_namespace.c#L62-L64)）。
- `src.call.42P06.373538bec86ad8eedfce8d7a` — `src/backend/commands/schemacmds.c` lines 132-135，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `5fd5f43dce5f36f06ed390014c06f244564072227d25a22735f594d2170626b1`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/schemacmds.c#L132-L135)）。
- `src.calls.REL_18_6.42P06` — 固定本地核心调用扫描；SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`。
- [`作者证据`](../../data/evidence/42p06.json) — 记录源码断言、消息角色和运行边界。
