PostgreSQL导入TXT文件报错:file_name列数据缺失原因排查
搞定PostgreSQL导入TXT时的"ERROR: missing data for column 'file_name'"(22P04)问题
为啥会报这个错?
说白了就是你用的PostgreSQL导入工具没正确识别TXT里的列分隔符,把整行内容都塞进了sno_id列,file_name列啥数据都没拿到,而它又是非空约束,自然就触发报错了。
手动插入没问题咋回事?
你手写INSERT语句的时候,明明白白告诉数据库哪个值对应哪个列,它当然能精准解析;但导入工具不一样,它默认的分隔符可能不是你TXT里用的空格,或者你的空格是多个/制表符,工具没拆分对,就会搞砸。
一步步解决它
- 先查分隔符设置
打开「导入/导出」向导选了文本格式后,一定要把"分隔符"改成空格(或者你TXT里实际用的,比如制表符)。很多工具默认用逗号当分隔符,这会把整行当成一个值全给sno_id,file_name自然空着。 - 确认列映射没搞反
就算你选了sno_id和file_name列,也得检查工具里的映射是不是第一列对应sno_id,第二列对应file_name。有时候工具会自动瞎映射,把第二列留空,那肯定报错。 - 检查TXT文件本身
确保每行的两个值之间是单个空格,别搞一堆多余空格、奇怪换行或者特殊字符。要是有多个空格,要么换成制表符,要么在支持正则的工具里把分隔符设成\s+。 - 直接用COPY命令更靠谱
要是工具实在不给力,就用PostgreSQL原生的COPY命令,参数全由你控制:
要是文件在你本地,用psql客户端的-- 服务器端文件导入(文件要在Postgres能访问的路径) COPY testdata_table(sno_id, file_name) FROM '/你的文件路径/xxx.txt' WITH (FORMAT text, DELIMITER ' ', HEADER false);\copy命令就行:\copy testdata_table(sno_id, file_name) FROM '/本地文件路径/xxx.txt' WITH (FORMAT text, DELIMITER ' ', HEADER false);
关于状态码22P04
这个码对应的是文本解析错误的子类,这里就是因为列拆分失败导致file_name缺数据,触发了非空约束的报错。
内容的提问来源于stack exchange,提问作者Sweety
相关产品推荐
相关产品推荐

