跳转到主要内容

42P06 — 重复模式

PostgreSQL SQLSTATE 42P06(duplicate_schema)的来源与诊断参考。

42P06 — 重复模式

速览

42P06duplicate_schema)是模式定义冲突。普通 CREATE 报 ERROR;IF NOT EXISTS 可发 NOTICE 并继续,但条件路径只是跳过创建,不会协调已有模式。

字段
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
别名

含义

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

诊断

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

处理

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

消息变体

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

版本

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

来源

  • src.errcodes.42P06.18.6src/backend/utils/errcodes.txt line 382,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba源码)。

  • src.call.42P06.4d5505b63e38ef1b25836623src/backend/catalog/pg_namespace.c lines 62-64,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 89675ba1bb9c531ab4f43db8a6f7cac00956561b342e42ea6eaae6b8d0b50d78源码)。

  • src.call.42P06.373538bec86ad8eedfce8d7asrc/backend/commands/schemacmds.c lines 132-135,固定于 724edf9bde9d356724ad384a2e196edc3c9f80f7;SHA-256 5fd5f43dce5f36f06ed390014c06f244564072227d25a22735f594d2170626b1源码)。

  • src.calls.REL_18_6.42P06 — 固定本地核心调用扫描;SHA-256 9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf

  • 作者证据 — 记录源码断言、消息角色和运行边界。