# 42P07 — 重复表或关系定义

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

# 42P07 — 重复表或关系定义

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

`42P07`（**duplicate_table**）覆盖关系名称冲突、条件 DDL 的 NOTICE，以及继承父项重复或继承环，应先识别操作。

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

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

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

## 含义 {#meaning}

18.6 核心路径中，表、序列、索引和 CREATE TABLE AS 冲突均报告 `relation "%s" already exists`。这些对象共享 `pg_class` 关系命名空间，因此另一种关系类型的同名对象也会造成冲突。索引的 `IF NOT EXISTS` 路径报告 NOTICE `relation "%s" already exists, skipping` 并直接返回，不检查已有索引定义是否符合请求。继承路径还对重复父项和 `circular inheritance not allowed` 使用此 SQLSTATE，后者 DETAIL 为 `"%s" is already a child of "%s".`。

## 诊断 {#diagnosis}

名称冲突查 `pg_class`/`pg_namespace`，并把序列、索引、表、视图和物化视图纳入检查。`IF NOT EXISTS` 的 NOTICE 还要核对已有对象的所有者、持久性、列、索引和选项，不能把源码中的名称检查当成定义比较。继承报文查 `pg_inherits` 和完整父列表，区分父项重复与继承环。

## 处理 {#response}

只有确认已有定义可接受时才使用幂等 DDL；关系名称冲突可选择采用已有对象或制定对象级迁移。重复父项应从父列表移除重复项，继承环则要打破父图并复核 `pg_inherits`；单纯改名不能修复父图。显式事务中的 `ERROR` 应先回滚保存点或回滚事务再查目录；NOTICE 路径无需该恢复。

## 消息变体 {#messages}

代表变体如下：

| 路径 | 严重性 | 主消息 | DETAIL |
| --- | --- | --- | --- |
| 关系名称冲突 | `ERROR` | `relation "%s" already exists` | 无 |
| 索引 `IF NOT EXISTS` 冲突 | `NOTICE` | `relation "%s" already exists, skipping` | 无 |
| 继承父项重复 | `ERROR` | `relation "%s" would be inherited from more than once` | 无 |
| 继承成环 | `ERROR` | `circular inheritance not allowed` | `"%s" is already a child of "%s".` |

## 版本 {#versions}

目录范围从 7.4 到 18.6、19beta3，不是精确的功能引入判断。选定的 18.6 路径覆盖关系名称查找、索引 `IF NOT EXISTS`、继承父项重复和继承环；未运行数据库。

## 相关 {#related}

- [`42P06`](../42p06/)
- [`42710`](../42710/)
- [`23505`](../23505/)
- [`42P04`](../42p04/)

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

- `src.call.42P07.694fcfd426e95ce13263fb9a` — `src/backend/catalog/heap.c` lines 1194-1196，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `e720ee58279590793edd0985b3c910970ef56e7361b8ef92e245370587e02a0e`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/catalog/heap.c#L1194-L1196)）。
- `src.call.42P07.38d8697cf62c00c05657a6d4` — `src/backend/catalog/index.c` lines 898-901，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `98a4156a5c21ae856a3b583b633cdeb578a5b69910386c9f166d69fcb04ba2d0`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/catalog/index.c#L898-L901)）。
- `src.call.42P07.30cb2a5359e1ec4bea60a466` — `src/backend/commands/tablecmds.c` lines 875-878，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/tablecmds.c#L875-L878)）。
- `src.call.42P07.19ee2522385544dc7ceb62bb` — `src/backend/commands/tablecmds.c` lines 17376-17381，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/tablecmds.c#L17376-L17381)）。
- `src.calls.REL_18_6.42P07` — 固定本地核心调用扫描；SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`。
- [`作者证据`](../../data/evidence/42p07.json) — 记录源码断言、消息角色和运行边界。
