{{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" "응용"}}