我在D:\DataSet\business_names_202007/businessDataSet.csv
中有一个制表符分隔的CSV文件,带有60万条记录(可能会增加)。我想将整个数据加载到以下postgresql表中。
PostgreSQL表:
CSV文件结构:
您可以看到上面的结构,CSV文件和db之间的列数有所不同(DB中“ transform_business”列额外)。在加载数据时,我们也需要添加它,此列的值如下所示。
db中的“ transform_business”列值与数据集中的“ BN_NAME”相同,但有以下更改:转换为大写字母,单词之间的所有空格都应删除
例如:
BN_NAME:墨尔本碰撞修复
transform_business:MELBOURNECOLLISIONREPAIR
工具:Dbeaver
数据库架构:testDev
表名:testdevtable
临时形成的警句:
COPY testdevtable(register_name,bn_name,bn_status,transform_business)
FROM 'D:\DataSet\business_names_202007/businessDataSet.csv' DELIMITER E’\t’ CSV HEADER;
答案 0 :(得分:0)
如果在我的位置,我会向业务表中添加一个ON INSERT
触发器,以在bn_name
期间转换transform_business
-> INSERT
。然后将transform_business
移出COPY
。第二种选择是在加载转换之前进行转换,并将transform_business
和新数据添加到CSV文件中。
将执行转换的示例SQL代码段:
SELECT upper(replace('Melbourne Collision Repair Centre Mentone', ' ', ''));
upper
---------------------------------------
MELBOURNECOLLISIONREPAIRCENTREMENTONE
另一种选择是仅COPY
(寄存器名,bn名称,bn状态)进入数据库(表上没有触发器),然后运行:
UPDATE business SET transform_business = upper(replace(bn_name, ' ', ''));
不确定此后会发生什么,是否要使用新数据输入transform_business值。如果用户/应用程序不打算输入它,那么我认为您将回到运行upper(replace(bn_name, ' ', ''))
的业务表上的触发器。
答案 1 :(得分:0)
也许您已经忽略了一条有价值的信息:您正在运行哪个Postgres版本?如果您具有或可以更新到版本 12 ,则可以重新定义表,以便transform_business列是生成的列。然后例如:
create table table_name(
id bigint generated always as identity
, register_name text
, bn_name text
, status text
, transform_name text generated always as ( upper(replace(bn_name,' ',''))) stored
) ;
如果您需要维护当前数据,则可以:
alter table table_name drop column transform_name;
alter table table_name add transform_name text generated always as ( upper(replace(bn_name,' ',''))) stored;
此选项将相当慢,尤其是在表很大的情况下,但这是一次性的过程。这两种选择都会给您一个“约束”,即不能直接更新transform_name,但会在bn_name更新时自动更新。
然后,您的复制命令将只加载register_name,bn_name和状态。