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 |