사용자 도구

사이트 도구


사이드바

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

문서의 이전 판입니다!


Merge Query

물리명 논리명 타입 KEY
시퀀스 seq 숫자 PK
제목 title 문자
내용 content 문자

-- MySQL/MariaDB & MSSQL & PostgreSQL
CREATE TABLE ex_merge (
	seq BIGINT NOT NULL PRIMARY KEY,
	title VARCHAR(100) NOT NULL,
	content TEXT NOT NULL
);

-- Oracle/Tibero
CREATE TABLE ex_merge (
	seq NUMBER NOT NULL PRIMARY KEY,
	title VARCHAR(100) NOT NULL,
	content CLOB NOT NULL
);

MySQL/MariaDB

-- MySQL 4.1 이상
-- 조건은 PK, UK 컬럼만 가능
INSERT INTO ex_merge (
	seq
	, title
	, content
) VALUES (
	1
	, '제목 INSERT'
	, '내용 INSERT'
)
ON DUPLICATE KEY
UPDATE
	title = '제목 UPDATE'
	, content = '내용 UPDATE'
;

MSSQL

-- MSSQL 2008 이상
MERGE INTO ex_merge a
	USING (SELECT 1 AS dummy) b
		ON a.seq = 1
WHEN MATCHED THEN
	UPDATE SET
		title = '제목 UPDATE'
		, content = '내용 UPDATE'
WHEN NOT MATCHED THEN
	INSERT (
		seq
		, title
		, content
	) VALUES (
		1
		, '제목 INSERT'
		, '내용 INSERT'
	)
;

Oracle/Tibero

-- Oracle 9i 이상
MERGE INTO ex_merge
	USING DUAL
		ON (seq = 1)
WHEN MATCHED THEN
	UPDATE SET
		title = '제목 UPDATE'
		, content = '내용 UPDATE'
WHEN NOT MATCHED THEN
	INSERT (
		seq
		, title
		, content
	) VALUES (
		1
		, '제목 INSERT'
		, '내용 INSERT'
	)
;

PostgreSQL

-- PostgreSQL 9.5 미만
WITH upsert AS (
	UPDATE SET
		title = '제목 UPDATE'
		, content = '내용 UPDATE'
	WHERE
		seq = 1
	RETURNING *
)
INSERT INTO ex_merge (
	seq
	, title
	, content
)
SELECT
	1
	, '제목 INSERT'
	, '내용 INSERT'
WHERE
	NOT EXISTS (SELECT * FROM upsert)
;

-- PostgreSQL 9.5 이상
-- 조건은 PK, UK 컬럼만 가능
INSERT INTO ex_merge (
	seq
	, title
	, content
) VALUES (
	1
	, '제목 INSERT'
	, '내용 INSERT'
)
ON CONFLICT (seq)
DO UPDATE SET
	title = '제목 UPDATE'
	, content = '내용 UPDATE'
;

-- PostgreSQL 15 이상
MERGE INTO ex_merge a
	USING (SELECT 1 AS dummy) b
		ON a.seq = 1
WHEN MATCHED THEN
	UPDATE SET
		title = '제목 UPDATE'
		, content = '내용 UPDATE'
WHEN NOT MATCHED THEN
	INSERT (
		seq
		, title
		, content
	) VALUES (
		1
		, '제목 INSERT'
		, '내용 INSERT'
	)
;