{{htmlmetatags>
metatag-description=(머지 쿼리, Merge Query, 머지, Merge, 데이터베이스, DBMS, SQL, MySQL, MariaDB, MSSQL, Oracle, Tibero, PostgreSQL)
metatag-og:description=(머지 쿼리, Merge Query, 머지, Merge, 데이터베이스, DBMS, SQL, MySQL, MariaDB, MSSQL, Oracle, Tibero, PostgreSQL)
}}
====== 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'
)
;
{{tag>"쿼리" "Query" "응용"}}