从CSV中进行复制时自动生成ID列[英] Autogenerating ID column when doing COPY from CSV

本文是小编为大家收集整理的关于从CSV中进行复制时自动生成ID列的处理方法,想解了从CSV中进行复制时自动生成ID列的问题怎么解决?从CSV中进行复制时自动生成ID列问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个简单的表(4个文本列和一个ID列).我正在尝试导入没有ID列的CSV文件.

在Postico I中,我有架构设置: 在此处输入图像描述

DROP TABLE changes;
CREATE TABLE changes(
id    SERIAL PRIMARY KEY,
commit_id TEXT,
additions INTEGER,
deletions INTEGER,
file_id TEXT
);
CREATE TEMP TABLE tmp_x AS SELECT * FROM changes LIMIT 0;
COPY tmp_x(commit_id,additions,deletions,file_id) FROM '/Users/George/git-parser/change_file' (format csv, delimiter E'\t');
INSERT INTO changes SELECT * FROM tmp_x
ON CONFLICT DO NOTHING;
DROP TABLE tmp_x;

但是我正在遇到错误ERROR: null value in column "id" violates not-null constraint

推荐答案

您需要指定列:

COPY tmp_x (commit_id, additions, deletions, file_id) 
FROM '/Users/George/git-parser/change_file' (format csv, delimiter E'\t');

copy语句中指定的列的顺序显然必须匹配输入文件中的列的顺序.


您也需要更改insert语句.

INSERT INTO changes SELECT * FROM tmp_x

将从tmp_x中插入所有列中,但是由于您没有将id列定义为id c5>在tmp_x表中,因此没有生成任何东西,null值已插入.和您的insert语句仅复制那些无空值.

您需要在insert语句中跳过id列:

INSERT INTO changes (commit_id,additions,deletions,file_id) 
SELECT commit_id,additions,deletions,file_id
FROM tmp_x
ON CONFLICT DO NOTHING;

您实际上可以从tmp_x

中删除id列

本文地址:https://www.itbaoku.cn/post/1764153.html

相关标签/搜索