PSQL - 如果列项不存在,则从 csv 文件复制
PSQL - Copy from csv file if column item does not exist
我正在尝试将一个 csv 文件导入到 postgres table 中,我可以使用 COPY FROM:
成功地做到这一点
import.sql
\copy myTable FROM '..\CSV_OUTPUT.csv' DELIMITER ',' CSV HEADER;
但是如果该查询当前不在数据库中,则该查询只会添加行,否则它会因错误而退出。 Key (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 应该已经包含 grey_foo 和 pink_foo,但不包含 black_foo,因为它的地址已经存在。
为了实现这一目标应该使用哪些正确的查询?非常感谢您的建议和想法。
首先将数据复制到暂存 table,然后仅使用具有尚不存在的键的行更新主 table (myTable
)。例如,假设您已将数据导入名为 staging
:
的 table
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
命令。
我正在尝试将一个 csv 文件导入到 postgres table 中,我可以使用 COPY FROM:
成功地做到这一点import.sql
\copy myTable FROM '..\CSV_OUTPUT.csv' DELIMITER ',' CSV HEADER;
但是如果该查询当前不在数据库中,则该查询只会添加行,否则它会因错误而退出。 Key (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 应该已经包含 grey_foo 和 pink_foo,但不包含 black_foo,因为它的地址已经存在。
为了实现这一目标应该使用哪些正确的查询?非常感谢您的建议和想法。
首先将数据复制到暂存 table,然后仅使用具有尚不存在的键的行更新主 table (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
命令。