选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 错误代码 / Class 42 语法错误或访问规则冲突

42701 duplicate_column

重复列

ERROR 已实测 详解 实测通过

条件名
duplicate_column
宏名称
ERRCODE_DUPLICATE_COLUMN
启用版本
7.4
状态
活跃

版本覆盖

速览

SQLSTATE 42701 是 Class 42 中的 duplicate_column42701 表示重复列。选定的 CREATE TABLE 路径两次列出 id,在创建修正后的不同列之前报告 column "%s" specified more than once

含义

42701 表示重复列。在处理表定义时,PostgreSQL 会先比较本地 ColumnDef 名称,再合并继承属性。因此在一个定义中两次列出同名列会在创建修复表前报告 ERRORcolumn "%s" specified more than once。这个本地名称检查不同于继承默认值、类型或排序规则冲突;后者可能使用其他 SQLSTATE。

诊断

检查展开后的生成列列表,包括带引号标识符,以及拼接到同一个 CREATE TABLE 中的迁移片段。PostgreSQL 在普通名称处理后比较标识符,因此意外重复的未引用名称仍然是同一列名。选定 DDL 的 ERROR 后自动提交会话仍为 IDLE;显式 BEGIN 中同样的错误会让事务进入 INERROR,必须 ROLLBACK 或回滚到合适保存点后再重试。要把它与 42611 的继承默认值冲突,以及继承列合并时的类型/排序规则错误区分开。

处理

删除重复定义或给它一个有意的不同名称,重新执行完整 DDL,并检查最终目录。如果重复来自已经执行过的迁移,先比较现有表定义,再决定使用 ALTER TABLE 还是新的 CREATE TABLE;不要假设失败的 CREATE TABLE 留下了半成品关系。选定修复创建 idpayload 两列并确认列数。

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

duplicate_column PG 10 / 18 有 SQL

前置条件

  • A runner-owned disposable target is provisioned.

触发

Create a table that lists id twice.

断言

  • SQLSTATE is 42701 with the duplicate-column diagnostic
  • The session remains IDLE
  • A table with distinct columns can be created and inspected

处置

Give each column a distinct name and rerun the DDL.

清理

Drop the case schema with an owner connection.

报文

选定的 tablecmds.c 分支以明确的 ERROR 发出主报文 column "%s" specified more than once%s 是重复列名。相邻源码分支可能为继承类型/排序规则冲突发出其他 SQLSTATE。只有客户端异常而没有服务器 SQLSTATE 和主报文时,不能据此认定 42701

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 column "%s" specified more than once

来源:src/backend/commands/tablecmds.c @ REL_18_6 · src/backend/commands/tablecmds.c @ REL_10_23

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TABLE syntax_schema.duplicate_table (id integer, id text);
CREATE TABLE syntax_schema.repaired_table (id integer, payload text);
SELECT count(*) FROM information_schema.columns WHERE table_schema = 'syntax_schema_name' AND table_name = 'repaired_table_name';

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42701 案例 JSON作者证据。运行器清单为 verify/cases/42701/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

  • 42701 is the duplicate_column condition in Class 42.

    核实方式Read fixed errcodes.txt and the locked catalogue metadata.

    不覆盖Directory identity does not identify every backend path.

    来源src/backend/utils/errcodes.txt

  • The fixed source calls for 42701 include the mechanism and message boundary selected for this page.

    核实方式Trace the resolved REL_18_6 and REL_10_23 source call records at the locked commits.

    不覆盖Other calls can use the same SQLSTATE with different context or dynamic fields.

    来源src/backend/commands/tablecmds.c · src/backend/commands/tablecmds.c

  • The selected duplicate_column case passed on isolated PostgreSQL 18.6 and 10.21 targets.

    核实方式Run the shared registry case and inspect structured diagnostics, state/recovery assertions, and cleanup.

    不覆盖This covers the selected case and targets only; it does not generalize to all drivers or intermediate releases.

    来源verify/cases/42701/cases.json · verify/cases/42701/snippets.json

  • The locked catalogue records 42701; runtime scope is limited to the selected targets.

    核实方式Read generated facts and selected summaries.

    不覆盖Definition presence is not an exact behavioral introduction.

    来源src/backend/utils/errcodes.txt · raw/calls/REL_18_6.jsonl · raw/calls/REL_10_23.jsonl

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed

同类错误代码

Class 42 语法错误或访问规则冲突 下的其他成员。