2017-09-19 1 views
0

은 내가 성공적으로 너무로부터 COPY를 사용 할 수있는 포스트 그레스 테이블에 CSV 파일을 가져 오기 위해 노력하고 있어요 존재하지 않는 경우 CSV 파일에서 복사 :PSQL 열 항목이

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 

내 원하는 출력은 주소이 존재하지 않는 경우 PostgreSQL을에 csv 파일에서 행을 삽입하는 것입니다. myTable에는 grey_foo 및 pink_foo가 이미 있어야하지만 black_foo는 주소가 이미 있으므로 포함되어 있어야합니다.

이 작업을 수행하려면 올바른 쿼리를 사용해야합니다. 귀하의 제안과 아이디어는 높이 평가됩니다.

답변

2

먼저 스테이징 테이블에 데이터를 복사 한 다음 아직 존재하지 않는 키가있는 행만 사용하여 메인 테이블 (myTable)을 업데이트하십시오. 예를 들어, staging라는 이름의 테이블에 데이터를 가져온 가정하면 당신은 포스트 그레스 9.5로 업그레이드 할 수 있다면, 당신은 대신 ON CONFLICT DO NOTHING 절을 가진 INSERT 명령을 사용할 수 있습니다

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; 

.