如何将每日的CSV数据导入带有生成列的表中(PostgreSQL)

3

我是PostgreSQL的新手,正在寻求一些指导和最佳实践。

我通过导入CSV文件创建了一个表。然后,我通过创建多个生成列来修改表格,就像这样:

ALTER TABLE master
ADD office VARCHAR(50)
GENERATED ALWAYS AS (CASE WHEN LEFT(location,4)='Chic' THEN 'CHI'
                     ELSE LEFT(location,strpos(location,'_')-1) END) STORED;

但是当我尝试将新数据导入表中时,出现以下错误:
ERROR:  column "office" is a generated column
DETAIL:  Generated columns cannot be used in COPY.

我的目标是每天导入新数据到表格中,并自动填充生成的列,以便按照我的要求转换数据。我该如何做呢?


你的可导入数据(csv文件)中是否包含“office”列?导入新数据时执行哪个命令? - undefined
@Johnny,这个csv文件中并没有包含office字段,office是根据csv中的"location"字段生成的列。我只是使用导入选项来导入新数据,我相信它使用了复制功能。我可以尝试使用其他函数,只是不确定如何操作。 - undefined
2个回答

0

当我从csv导入PG时,我遇到了同样的错误 - 我发现即使我的列已经生成,我仍然需要在导入的数据中拥有它,只需将其留空即可。当列名存在且映射到我的数据库列名时,运行正常。


0
CREATE TEMP TABLE master (location VARCHAR);

ALTER TABLE master
ADD office VARCHAR
GENERATED ALWAYS AS (
    CASE
        WHEN LEFT(location, 4) = 'Chic' THEN 'CHI'
        ELSE LEFT(location, strpos(location, '_') - 1)
    END
) STORED;
                     
--INSERT INTO master (location) VALUES ('Chicago');
--INSERT INTO master (location) VALUES ('New_York');

COPY master (location) FROM $$d:\cities.csv$$ CSV;

SELECT * FROM master;

这是您期望的结构和行为吗?如果不是,请提供有关您的表结构、可导入数据和导入命令的更多详细信息。
另外,也许在尝试导入CSV文件时,列没有正确链接,或者分隔符没有正确设置。请尝试按照CSV文件中出现的确切顺序指定每一列。

https://www.postgresql.org/docs/12/sql-copy.html

注意:d:\cities.csv 包含以下内容:

Chicago
New_York

编辑:

如果表格和CSV文件中的列位置混乱,可以使用以下操作:

1. create temporary table tmp (csv_column1 <data_type>, csv_column_2 <data_type>, ...); (including ALL csv columns)
2. copy tmp from '/path/to/file.csv';
3. insert into master (location, other_info, ...) select csv_column_3 as location, csv_column_7 as other_info, ... from tmp;

使用中间表导入数据可能会稍微减慢速度,但却给你带来了很多灵活性。

谢谢!我觉得这个很接近,但是我的CSV文件有很多列,位置只是其中之一。还有其他生成的列。所以我需要逐个指定每一列吗?在尝试上述方法后,我遇到了以下错误:ERROR: 在最后一个预期列后有额外的数据 上下文:COPY attend, line 1: "col1,col2,col3" - undefined
该错误可能是因为在COPY命令中没有指定所有的csv列,或者csv列的数量在所有行中不一致。如果列位置混乱(比较表格和csv文件),我建议使用临时表格以三个清晰的步骤执行此操作(我已经编辑了答案并提供了详细信息)。另外,为了调试,我建议仔细检查只包含几行(1-2行)的csv文件,因为可能会出现意外格式错误的行。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接