postgresql merge(upsert+delete) 구현하는 방법이다.
이걸 1트랜잭션으로 묶거나 프로시저나 펑션 등으로 호출하면 된다.
lock table test_tbl in exclusive mode;
delete from test_tbl
where not exists ( select 1
from tmp_test_tbl
where test_tbl.pk = tmp_test_tbl.pk ) ;
update test_tbl
set pk = tmp_test_tbl.pk
, c1 = tmp_test_tbl.c1
, c2 = tmp_test_tbl.c2
, c3 = tmp_test_tbl.c3
from tmp_test_tbl
where test_tbl.pk = tmp_test_tbl.pk ;
insert into test_tbl (
pk
, c1
, c2
, c3
) select tmp_test_tbl.pk
, tmp_test_tbl.c1
, tmp_test_tbl.c2
, tmp_test_tbl.c3
from tmp_test_tbl
left join test_tbl
on test_tbl.pk = tmp_test_tbl.pk
where test_tbl.pk is null;
'Programming > Postgresql' 카테고리의 다른 글
Postgresql lock 쿼리 확인 및 kill하기 (0) | 2019.06.21 |
---|---|
Postgresql 현재 실행중인 쿼리 확인 및 kill 하기 (0) | 2019.06.15 |