You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将JSON文件导入PostgreSQL 16时报错22P04:最后预期列后有额外数据

问题分析与解决

错误原因

PostgreSQL的COPY命令默认按行处理数据,且默认以制表符/空格作为列分隔符。你的JSON文件是多行嵌套结构,第二行内容包含空格和JSON语法,COPY会误将这些内容识别为多列数据,但临时表tmp仅定义了1个列,因此触发extra data after last expected column错误。

正确导入方法

方法1:修改COPY参数强制整行导入

指定一个不会出现在JSON中的罕见字符作为分隔符和引号,避免COPY拆分内容:

DROP TABLE IF EXISTS tmp;
CREATE TEMP TABLE tmp (c TEXT);

COPY tmp FROM 'C:\ChrisDev\Readings\14.json'
DELIMITER E'\x01'  -- 使用ASCII控制字符作为分隔符,确保无冲突
QUOTE E'\x02';     -- 用另一个罕见字符作为引号标记

方法2:用pg_read_file直接读取整个文件

如果PostgreSQL服务有权限访问目标文件,可直接通过函数读取完整JSON内容:

DROP TABLE IF EXISTS tmp;
CREATE TEMP TABLE tmp (c TEXT);

INSERT INTO tmp
SELECT pg_read_file('C:\ChrisDev\Readings\14.json');

注意:若提示权限问题,可将JSON文件移动到PostgreSQL数据目录下的子目录,或调整postgresql.conf中的相关权限配置。

方法3:通过psql的\copy结合系统命令

在psql客户端中执行,借助Windows的type命令读取完整文件:

\copy tmp (c) FROM PROGRAM 'type C:\ChrisDev\Readings\14.json';

后续JSON解析(可选)

导入后可将字段转为jsonb类型,方便提取ChannelReadings等数据:

ALTER TABLE tmp ALTER COLUMN c TYPE jsonb USING c::jsonb;

-- 提取ChannelReadings字段数据
SELECT jsonb_extract_path_text(c, 'ChannelReadings') FROM tmp;

内容的提问来源于stack exchange,提问作者ChrisAsi71

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:08:28