我有一个简单的表格(4 个文本列和一个 ID 列)。我正在尝试导入没有 ID 列的 CSV 文件。
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;
但是我得到了错误错误:“id”列中的空值违反了非空约束
最佳答案
您需要指定列:
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
列定义为serial
在 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
列
关于postgresql - 从 CSV 执行 COPY 时自动生成 ID 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35161432/