将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
相关产品推荐
相关产品推荐

