본문 바로가기

WEB

[PostgreSQL] PostgreSQL UPSERT 알아보기

728x90

PostgreSQL을 이용해 데이터가 존재하지 않으면, INSERT

 

데이터가 존재하면, UPDATE를 수행하도록 해보자.

 

 

 

 

 


INSERT ... ON CONFLICT (unique_column) DO UPDATE

1
2
3
4
5
INSERT INTO my_table (id, name, value)
VALUES (1'테스트'100)
ON CONFLICT (id) 
DO UPDATE SET name = EXCLUDED.name, value = EXCLUDED.value;
 
cs

 

 

insert 문을 수행하고 PK 혹은 UNIQUE인 id가 에러가 발생하면 DO 이후의 업데이트 문을 실행한다.

 

 

 

 

 


WITH ... SELECT를 사용한 INSERT 또는 UPDATE

 

1
2
3
4
5
6
7
8
9
10
11
12
WITH upsert AS (
    SELECT * FROM my_table WHERE id = 1
)
UPDATE my_table
SET name = '테스트', value = 100
WHERE id = 1
RETURNING *;
 
INSERT INTO my_table (id, name, value)
SELECT 1'테스트'100
WHERE NOT EXISTS (SELECT 1 FROM upsert);
 
cs

 

위의 id와 같이 PK 혹은 UNIQUE가 없어 CONFLICT가 불가능할 경우 사용하면 좋다.

 

먼저 데이터를 조회한 이후, 데이터가 존재하면 UPDATE, 없을 경우 INSERT를 수행한다

 

 

 

 

 

 

 

 

EX)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WITH upsertTest AS (
    UPDATE upsert_test_table
    SET name = 'upsertTest2333'
    WHERE id1 = '000181'
   AND id2= '6a24661b1c' 
   AND id3 = '54a85aaff2' 
   AND code = '40'
    RETURNING *
)
-- 존재하지 않으면 INSERT
INSERT INTO upsert_test_table  (
  id1, seq, id2, id3, code, date, user
)
SELECT '000181'5'6a24661b1c''54a85aaff2''10', now(), 'sqltestUser'
WHERE NOT EXISTS (
    SELECT 1 FROM upsertTest
);
cs