【问题标题】:PSQL - Copy from csv file if column item does not existPSQL - 如果列项不存在,则从 csv 文件复制
【发布时间】:2018-02-27 15:51:37
【问题描述】:

我正在尝试将 csv 文件导入到 postgres 表中,我可以使用 COPY FROM 成功地做到这一点:

import.sql

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

但是,该查询仅在当前不在数据库中时才添加行,否则它会因错误而退出。 键 (id)=(#) 已存在。

我的表

  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

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

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

【问题讨论】:

    标签: postgresql csv psql postgresql-9.3


    【解决方案1】:

    首先将数据复制到临时表中,然后仅使用不存在键的行更新您的主表 (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,则可以改为使用带有 ON CONFLICT DO NOTHING 子句的 INSERT 命令。

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2013-06-24
      相关资源
      最近更新 更多