PSQL - 如果列项不存在,则从csv文件复制

时间:2017-09-19 01:56:35

标签: postgresql csv psql postgresql-9.3

我正在尝试将csv文件导入到postgres表中,我可以使用 COPY FROM 成功执行此操作:

import.sql

\copy myTable FROM '..\CSV_OUTPUT.csv' DELIMITER ',' CSV HEADER;

但是,如果当前不在数据库中,则该查询仅添加行,否则将退出并显示错误。 密钥(id)=(#)已存在。

myTable的

  id  |    alias    |    address            
------+-------------+---------------
  11  |   red_foo   |   10.1.1.11
  12  |  blue_foo   |   10.1.1.12

CSV_OUTPUT.csv

  id  |    alias    |    address            
------+-------------+---------------
  10  | black_foo   |   10.1.1.11
  12  |  blue_foo   |   10.1.1.12
  13  |  grey_foo   |   10.1.1.13
  14  |  pink_foo   |   10.1.1.14

如果地址不存在,我想要的输出是将csv文件中的行插入postgresql。 myTable 应该包含grey_foo和pink_foo但不包含black_foo,因为它的地址已经存在。

为实现这一目标,应该使用哪些正确的查询?非常感谢您的建议和想法。

1 个答案:

答案 0 :(得分:3)

首先将数据复制到临时表中,然后仅使用具有尚不存在的键的行更新主表(myTable)。例如,假设您已将数据导入名为staging的表:

with nw as (
    select s.id, s.alias, s.address
    from staging as s
    left join mytable as m on m.address=s.address
    where m.address is null
    )
insert into mytable
    (id, alias, address)
select id, alias, address
from nw;

如果您可以升级到Postgres 9.5,则可以使用带有INSERT子句的ON CONFLICT DO NOTHING命令。