从CSV导入数据到Postgres数据库时实现条件插入

3
我希望将CSV导入Postgres表中,但我想在执行过程中决定某一列是否应该是0或1,这取决于表中已有的行。
例如,我正在向一个表中添加联系人,并且想要将它们标记为主要联系人,如果没有已经存在的主要联系人,则将它们添加为次要联系人:
现有行:
contact_id | branch_id | primary
-------------+-----------+--------
1          | 100       | 1
2          | 101       | 1
3          | 101       | 0

CSV数据,

contact_id | branch_id
-----------+-----------
4          | 100
5          | 101
6          | 102
7          | 103

期望的结果:

contact_id | branch_id | primary
-----------+-----------+--------
1          | 100       | 1
2          | 101       | 1
3          | 101       | 0
4          | 100       | 0
5          | 101       | 0
6          | 102       | 1
7          | 103       | 1

注意:由于这些分支已经存在主要联系人,因此联系人4和5被添加为次要联系人,而由于这些分支不存在主要联系人,因此联系人6和7被添加为主要联系人。

在Postgres 9.2中是否可能实现此功能?

1个回答

4
我会使用PL/pgSQL函数和临时表来分两个阶段实现,大致如下:
  1. 创建一个临时表,并使其列与CSV文件对应
  2. COPY FROM 你的CSV文件到该临时表中
  3. 基于从连接到最终表中的现有行的临时表 LEFT JOINSELECT,插入到最终表中。这样你就可以确定是否已经存在一个主键行
  4. 删除临时表
(顺便说一下,这意味着你可以使用一个以root身份创建但由权限较低的用户运行的SECURITY DEFINER函数,将CSV文件名硬编码而不是以root身份运行整个导入过程。)

好的,我就这么做。在允许的五分钟内会接受。谢谢IMSoP。 - Chris McKinnel

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