2017-02-12 1 views

답변

6

conflict_target를 새 것으로 오래된 행을 여러 null 허용 열에서이 테이블에 고유 인덱스를 생성하고 업데이트 할 방법을 찾는 것입니다 on conflict에서 기존 고유 색인을 식별해야합니다.

on conflict (vendor, external_id, extinct) 

3 개의 열에 색인이 없기 때문에 사용할 수 없습니다. Postgres는 여러 목표를 충족시키기 위해 여러 색인을 결합하는 것이 현명하지 않습니다.

당신은 그러나이 같은 단일 부분 인덱스 만들 수 있습니다

insert into security (vendor, external_id, extinct) 
    values('Legion', 'LGNONE', false) 
on conflict (vendor, external_id, extinct)   -- exact match to the index definition 
    where coalesce(vendor, external_id) is not null -- obligatory index_predicate 
do update set 
    vendor = excluded.vendor, 
    external_id = excluded.external_id, 
    extinct = excluded.extinct 

참고 특별한 기록 excluded의 사용 :

create unique index unique_vendor_external_id 
    on security(vendor, external_id, extinct) 
    where coalesce(vendor, external_id) is not null; 

지금 당신이 충돌 대상으로 세 개의 열을 사용할 수 있습니다 . 문서의 경우 :

설정 및 ON 충돌이 조항은 UPDATE를 수행 테이블의 이름 (또는 별명)를 사용하여 기존 행에 액세스 할 수 WHERE 및 특별 제외 테이블을 사용하여 삽입을 제안 행합니다.

+0

이것은 훌륭한 제안이며 답변입니다. 고마워요! – cingulata