본문 바로가기

개발/PostgreSQL

[PostgreSQL] Bulk Upsert

반응형

Bulk Upsert 방법은 총 두가지가 있다

1.

WITH n(column) AS (
  	VALUES 
	  	(value) 
)
insert into table (column)
select column from n	
on conflict (PkColumn) do 
update set
	column = excluded.column;

설명 : 

1. WITH 절을 이용하여 임시 테이블을 생성하여 upsert할 값 셋팅

2. 1번에서 만든 값으로 target Table에 insert

3. insert PK가 중복되어 실패시 update로 변경

 

2.

WITH
n(column) AS (
  VALUES
    (value)
),

-- update existing rows
upsert AS (
  UPDATE table o
  SET column=n.column
  FROM n WHERE o.PkColumn = n.PkColumn 
  RETURNING o.PkColumn
)

-- insert missing rows
INSERT INTO table (column)
SELECT  n.column
FROM n
WHERE n.PkColumn NOT IN (
  SELECT PkColumn FROM upsert
)

설명 :

1. WITH절을 이용하여 임시 테이블을 생성하여 upsert할 값 셋팅

2. 1번의 값으로 target table에 Update Update 된 값은 WITH절을 이용하여 upsert 테이블 생성

3. insert 로직 동작시 upsert 테이블에서 update 된 값을 제거한 후 insert 

반응형