2014-05-14 2 views
0

StackOverflow에 대해 비슷한 질문이 있지만 내 사례와 정확하게 일치하지 않습니다. 합성 고유 제한이있는 PostgreSQL 테이블에 대량 삽입하려고합니다. 어떤 제약없이 임시 테이블 (temptable)을 생성하고 데이터에 가능한 중복 값을로드했습니다. 여태까지는 그런대로 잘됐다.PostgreSQL의 중복 키 오류 하위 쿼리가있는 INSERT

이제 고유 인덱스가있는 실제 테이블 (realtable)으로 데이터를 전송하려고합니다.

INSERT INTO realtable 
SELECT * FROM temptable WHERE NOT EXISTS (
    SELECT 1 FROM realtable WHERE temptable.added_date = realtable.added_date 
           AND temptable.product_name = realtable.product_name 
); 

그러나, 나는 점점 오전 중복 키 오류 :

내 질문은
ERROR: duplicate key value violates unique constraint "realtable_added_date_product_name_key" 
SQL state: 23505 
Detail: Key (added_date, product_name)=(20000103, TEST) already exists. 

의이 절은이를 방지 존재합니다 WHERE 안이를 위해, 나는 서브 쿼리와 INSERT 문을 사용 사고? 어떻게 해결할 수 있습니까?

답변

2

NOT EXISTS 절은 temptable의 행이 realtable의 기존 행과 충돌하지 않도록합니다. temptable의 여러 행이 서로 충돌하는 것을 방지하지 못합니다. 이는 각 행을 삽입 한 후에 다시 계산하지 않고 realtable의 초기 상태를 기반으로 SELECT이 한 번 계산되기 때문입니다.

SELECT 쿼리에서 GROUP BY 또는 DISTINCT ON을 사용하면 중복을 생략 할 수 있습니다.

INSERT INTO realtable 
SELECT DISTINCT ON (added_date, product_name) * 
FROM temptable WHERE NOT EXISTS (
    SELECT 1 FROM realtable WHERE temptable.added_date = realtable.added_date 
           AND temptable.product_name = realtable.product_name 
) 
ORDER BY ???; -- this ORDER BY will determine which of a set of duplicates is kept by the DISTINCT ON 
관련 문제