사용자 도구

사이트 도구


사이드바

기술문서:레퍼런스:쿼리:응용:merge_query

문서의 이전 판입니다!


Merge Query

최소 지원 버전은 약간의 차이가 있을 수 있습니다.
물리명 논리명 타입 KEY
머지 키 merge_key 문자형 PK
머지 값 merge_value 문자형

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'
	)
;