postgresql - 从 CSV 执行 COPY 时自动生成 ID 列

标签 postgresql csv

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

在 Postico 中,我有这样的模式设置: enter image description here

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 列定义为serialtmp_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/

相关文章:

python - 使用 psycopg2 访问 Cloud SQL 实例的配置

sql - information_schema 中referential_constraints.unique_constraint* 列的NULL 值

postgresql - Postgres 是否有系统表列出 date_trunc 的精度值?

c - postgres 如何获取 char varchar 和 text 数据类型的列大小

powershell - 如何在powershell中的csv中包含所有数组对象的所有属性

python - 迷失在 XML 和 Python 中

postgresql - 如何简化这个复杂的查询?

python - 使用 pytube 库从 csv 下载 youtube 链接

python - 如何在 python 中将 xml 文件转换为 csv 输出?

ios - Swift 从 UITableView 创建 CSV 并附加到电子邮件