2017-01-18 2 views
0

자동 증가 기본 키 열 "id"와 고유 키가 "name"열에있는 테이블에 postgres에서 올바른 업셋을 수행하는 방법을 찾으려고합니다. .Postgres에서 Upsert 및 자동 증가 열

문제는 소스 테이블과 대상 테이블이 2 개의 별도 시스템에 있으므로 최신 "ID"가 대상 테이블에 있는지 쉽게 알 수 없습니다.

내가 지금하고있는 방식은 대상 테이블에서 소스 테이블로 데이터를 가져 와서 가장 높은 "ID"를 확인하고 소스 데이터베이스의 테이블을 업데이트 한 다음 대상 테이블에 업서 트를 수행하는 것입니다. 그러나 당신이 볼 수 있듯이, 그것은 복잡해 보인다.

내가 원하는 무엇의 예는 다음과 같습니다

소스 테이블 :

id status name 
1 ok John 
2 open Monica 

대상 테이블 : upsert의

id status name 
.  .  . 
.  .  . 
44 ok David 
45 open John 

결과 :

id status name 
.  .  . 
.  .  . 
44 ok David 
45 ok John 
46 open Monica 

간단한 업 그레 이드 "id"열로 인해 중복 키 충돌이 발생합니다.

+1

왜 ID없이 상태 (이름, 이름)를 삽입하면 시퀀스가 ​​ID를 처리 할 수 ​​있습니까? –

답변

0

대상 쪽에서 postgres_fdw를 사용하여 원본 테이블에 대한 외부 테이블을 만듭니다.

그럼 당신은이 status 또는 name 또는 두 가지 모두에 고유 제한 조건을 필요로하는 일반

INSERT INTO dest (status, name) 
    SELECT status, name FROM foreign_source 
    ON CONFLICT DO UPDATE 
    SET status = EXCLUDED.status, 
     name = EXCLUDED.name; 

를 사용할 수 있습니다.

+0

감사합니다. 실제로 시퀀스에 문제가있는 것 같지만 응답으로 설정할 수 있습니다. 비슷한 질문을하는 사람이 삽입 값에 id를 사용하지 않는 것의 중요성을 돕는다. – johan855