Merge Query
최소 지원 버전은 약간의 차이가 있을 수 있습니다.
테이블 명세
| 물리명 | 논리명 | 타입 | 길이 | KEY |
| 머지 키 | merge_key | 문자형 | | PK |
| 머지 값 | merge_value | 문자형 | 100 | |
SQL 스크립트
CREATE TABLE ex_merge (
merge_key VARCHAR(100) NOT NULL PRIMARY KEY,
merge_value VARCHAR(100) NOT NULL
);
MySQL/MariaDB
/*
MySQL 4.1 이상/MariaDB 5.1 이상
*/
-- 조건은 PK, UK 컬럼만 가능
INSERT INTO ex_merge (
merge_key
, merge_value
) VALUES (
'1'
, 'INSERT'
)
ON DUPLICATE KEY
UPDATE
merge_value = 'UPDATE'
;
MSSQL
/*
MSSQL 2008 이상
*/
MERGE INTO ex_merge a
USING (SELECT 1 AS dummy) b
ON a.merge_key = '1'
WHEN MATCHED THEN
UPDATE SET
merge_value = 'UPDATE'
WHEN NOT MATCHED THEN
INSERT (
merge_key
, merge_value
) VALUES (
'1'
, 'INSERT'
)
;
Oracle/Tibero
/*
Oracle 9i 이상/Tibero 6 이상
*/
MERGE INTO ex_merge
USING DUAL
ON (merge_key = '1')
WHEN MATCHED THEN
UPDATE SET
merge_value = 'UPDATE'
WHEN NOT MATCHED THEN
INSERT (
merge_key
, merge_value
) VALUES (
'1'
, 'INSERT'
)
;
PostgreSQL
/*
PostgreSQL 9.1 이상
*/
WITH upsert AS (
UPDATE ex_merge SET
merge_value = 'UPDATE'
WHERE
merge_key = '1'
RETURNING *
)
INSERT INTO ex_merge (
merge_key
, merge_value
)
SELECT
'1'
, 'INSERT'
WHERE
NOT EXISTS (SELECT * FROM upsert)
;
/*
PostgreSQL 9.5 이상
*/
-- 조건은 PK, UK 컬럼만 가능
INSERT INTO ex_merge (
merge_key
, merge_value
) VALUES (
'1'
, 'INSERT'
)
ON CONFLICT (merge_key)
DO UPDATE SET
merge_value = 'UPDATE'
;
/*
PostgreSQL 15 이상
*/
MERGE INTO ex_merge a
USING (SELECT 1 AS dummy) b
ON a.merge_key = '1'
WHEN MATCHED THEN
UPDATE SET
merge_value = 'UPDATE'
WHEN NOT MATCHED THEN
INSERT (
merge_key
, merge_value
) VALUES (
'1'
, 'INSERT'
)
;