맨위로가기

Merge (SQL)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

MERGE는 SQL:2003 표준에 도입된 SQL 문으로, 대상 테이블과 원본 테이블을 비교하여 일치하는 데이터는 업데이트하고, 일치하지 않는 데이터는 삽입하는 기능을 수행한다. 표준 구문은 `MERGE INTO 대상테이블 USING 원본테이블 ON (병합조건)` 형태로, 여러 데이터베이스 시스템에서 지원된다. 일부 데이터베이스는 표준 구문 외에 `INSERT ... ON DUPLICATE KEY UPDATE`, `INSERT ... ON CONFLICT`, `INSERT OR REPLACE INTO` 등 MERGE와 유사한 기능을 하는 비표준 구문을 제공하며, upsert라는 용어로도 사용된다. NoSQL 데이터베이스에서도 유사한 개념이 적용된다.

2. 표준 구문

SQL:2003 표준에서 정의된 `MERGE` 문의 기본 구문은 다음과 같다.

```sql

MERGE INTO target_table USING source_table ON (merge_condition)

WHEN MATCHED THEN

UPDATE SET column1 = value1 [, column2 = value2 ...]

WHEN NOT MATCHED THEN

INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])

```


  • `target_table`: 변경될 데이터가 있는 대상 테이블이다. (`주 테이블`, `테이블이름` 등으로 표현되기도 함)
  • `source_table`: 업데이트하거나 삽입할 데이터를 제공하는 원본 테이블 (또는 뷰, 하위 쿼리)이다. (`서브 테이블`, `보조 테이블`, `테이블_참조` 등으로 표현되기도 함)
  • `ON (merge_condition)`: 대상 테이블과 원본 테이블의 행을 비교하여 병합할 조건을 지정한다. 이 조건에 따라 각 행이 `MATCHED` 또는 `NOT MATCHED` 상태로 결정된다.
  • `WHEN MATCHED THEN`: 병합 조건(`merge_condition`)을 만족하는 행, 즉 대상 테이블과 원본 테이블 모두에 존재하는 행에 대해 수행할 작업을 정의한다. 일반적으로 `UPDATE` 문을 사용하여 대상 테이블의 데이터를 수정한다.
  • `WHEN NOT MATCHED THEN`: 병합 조건을 만족하지 않는 행, 즉 원본 테이블에는 존재하지만 대상 테이블에는 존재하지 않는 행에 대해 수행할 작업을 정의한다. 일반적으로 `INSERT` 문을 사용하여 원본 테이블의 데이터를 대상 테이블에 추가한다.


SQL:2003 표준에서는 여러 개의 원본 행(source rows)이 하나의 대상 행(target row)과 일치하는 경우 오류가 발생하도록 규정하고 있다. 즉, `MERGE` 문을 사용하여 하나의 대상 행을 여러 번 업데이트할 수 없다.

다음과 같은 데이터베이스 관리 시스템(DBMS)들이 표준 `MERGE` 구문을 지원한다. 일부 시스템은 표준 구문 외에 비표준 SQL 확장 기능을 추가로 제공하기도 한다.

데이터베이스 관리 시스템참조
오라클 데이터베이스[26][17]
DB2[27][18]
마이크로소프트 SQL 서버[28][19]
파이어버드[29][20]
PostgreSQL[1][21]
테라데이타
EXASOL
큐브리드
H2
HSQLDB
Vectorwise
아파치 더비


3. 비표준 구문

일부 데이터베이스 시스템은 SQL 표준의 MERGE 문과 유사한 기능을 자체적인 비표준 구문이나 확장 기능을 통해 제공하기도 한다.[30][31][32][5][8][9][10][13][14][15][16][22][23][24][25] 이러한 기능들은 각 데이터베이스 시스템의 특성에 맞춰 구현되었으며, 표준 MERGE 문과는 구문이나 동작 방식에서 차이가 있을 수 있다. 대표적인 예로는 MySQLINSERT ... ON DUPLICATE KEY UPDATEPostgreSQLINSERT ... ON CONFLICT 등이 있다. 자세한 내용은 아래 하위 섹션에서 각 데이터베이스별 구현 방식을 설명한다.

3. 1. Upsert (업서트)

일부 데이터베이스 구현에서는 테이블에 레코드가 존재하지 않으면 삽입하고, 이미 존재하면 기존 레코드를 업데이트하는 데이터베이스 구문 또는 구문 조합을 설명하기 위해 '''''upsert'''''(update와 insert의 혼성어)라는 용어를 사용한다. 이 기능은 PostgreSQL 버전 9.5 이상[2]SQLite 버전 3.24 이상[3]에서 사용되며, "MERGE"에 해당하는 의사 코드를 축약하는 데에도 사용된다.

Microsoft Azure SQL Database에서도 이 용어를 사용한다.[4]

3. 2. 기타 비표준 구현

일부 데이터베이스 관리 시스템(DBMS)은 표준 SQLMERGE 문과 유사한 기능을 비표준 구문으로 제공하기도 한다.

  • MySQLINSERT ... ON DUPLICATE KEY UPDATE 구문[5][30]REPLACE INTO 구문[6][31]을 지원한다. INSERT ... ON DUPLICATE KEY UPDATEPRIMARY KEY 또는 UNIQUE 제약 조건이 있는 경우에만 사용할 수 있다는 제약이 있다. REPLACE INTO는 먼저 삽입을 시도하고, 실패하면 기존 행을 삭제한 후 새 행을 삽입한다. 또한 INSERT 문에 IGNORE[7]을 사용하여 "중복 키" 오류를 무시하고 기존 행은 변경하지 않으면서 새 행만 삽입할 수도 있다.
  • SQLiteINSERT OR REPLACE INTO[32][25] 구문을 지원하며, MySQL과의 호환성을 위해 REPLACE INTO[8]도 별칭으로 지원한다.
  • Firebird는 MERGE INTO를 지원하지만, 표준과 달리 소스 데이터 행이 여러 개여도 오류를 발생시키지 않는다. 또한 단일 행을 위한 UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)] 구문도 지원하지만, 이 구문은 삽입과 업데이트 시 다른 작업을 지정할 수는 없다.
  • IBM Db2는 표준 MERGE 구문을 확장하여, 조건을 추가하는 가드와 함께 여러 개의 WHEN MATCHEDWHEN NOT MATCHED 절을 사용할 수 있도록 지원한다.
  • Microsoft SQL Server는 표준 MERGE 구문을 확장하여, 가드와 함께 WHEN NOT MATCHED BY SOURCE 절을 통해 Left Join과 유사한 기능을 지원한다.
  • PostgreSQL은 버전 15부터 표준 MERGE를 지원한다. 이전 버전에서는 INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action 구문을 통해 유사한 기능을 구현했다.[9][24]
  • CUBRIDMERGE INTO[10] 문을 지원한다. 또한 MySQL과의 호환성을 위해 INSERT ... ON DUPLICATE KEY UPDATE[11] 구문과 REPLACE INTO[12] 구문도 지원한다.
  • Apache Phoenix는 UPSERT VALUES[13]UPSERT SELECT[14] 구문을 지원한다.
  • Spark SQL은 MERGE INTO 구문에서 UPDATE SET *INSERT * 절을 지원하여 기능을 확장했다.[15]
  • Apache Impala는 UPSERT INTO ... SELECT 구문을 지원한다.[16]

4. NoSQL에서의 활용

MERGE와 유사한 개념은 일부 NoSQL 데이터베이스에서도 찾아볼 수 있다.

MongoDB에서는 키와 연관된 값의 필드를 ''update'' 연산을 사용해 갱신할 수 있다. 만약 해당 키를 찾을 수 없으면 ''update'' 연산은 오류를 발생시킨다. 하지만 ''update'' 연산 시 ''upsert'' 플래그를 설정하면 동작이 달라진다. 이 경우, 키가 존재하지 않으면 주어진 키에 새로운 값을 저장하고, 키가 이미 존재하면 해당 값을 새로운 값으로 대체한다.

Redis에서는 ''SET'' 연산을 사용하여 주어진 키와 연관된 값을 설정한다. Redis는 값의 내부 구조를 상세히 알지 못하기 때문에, 특정 필드만 갱신하는 개념보다는 전체 값을 새로 설정하는 방식에 가깝다. 따라서 ''SET'' 연산은 항상 "설정 또는 대체"의 의미를 가진다. 즉, 키가 없으면 새로 생성하고, 키가 있으면 기존 값을 덮어쓴다.

참조

[1] 웹사이트 E.1. Release 15 https://www.postgres[...] 2022-10-13
[2] 웹사이트 PostgreSQL Upsert Using INSERT ON CONFLICT statement http://www.postgresq[...]
[3] 문서 upsert http://sqlite.org/la[...] 2018-06-06
[4] 웹사이트 MERGE (Transact-SQL) https://msdn.microso[...] Microsoft Learn
[5] 문서 MySQL :: MySQL 5.1 Reference Manual :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax http://dev.mysql.com[...]
[6] 문서 MySQL 5.1 Reference Manual: 11.2.6 REPLACE Syntax http://dev.mysql.com[...]
[7] 웹사이트 MySQL 5.5 Reference Manual :: 13.2.5 INSERT Syntax http://dev.mysql.com[...] 2013-10-29
[8] 웹사이트 SQL As Understood By SQLite: INSERT http://www.sqlite.or[...] 2012-09-27
[9] 문서 PostgreSQL INSERT page http://www.postgresq[...]
[10] 웹사이트 New CUBRID 9.0.0 http://www.cubrid.or[...] CUBRID Official Blog 2012-10-30
[11] 문서 CUBRID :: Data Manipulation Statements :: Insert :: ON DUPLICATE KEY UPDATE Clause http://www.cubrid.or[...]
[12] 문서 CUBRID :: Data Manipulation Statements :: Replace http://www.cubrid.or[...]
[13] 웹사이트 UPSERT VALUES https://phoenix.apac[...]
[14] 웹사이트 UPSERT SELECT https://phoenix.apac[...]
[15] 웹사이트 MERGE INTO (Delta Lake on Databricks) https://docs.databri[...]
[16] 웹사이트 UPSERT Statement (Apache Impala Documentation) https://impala.apach[...]
[17] 웹사이트 MERGE http://otndnld.oracl[...] 2009-09-23
[18] 웹사이트 MERGE ステートメント http://publib.boulde[...] 2009-09-23
[19] 웹사이트 MERGE (Transact-SQL) http://msdn.microsof[...] 2009-09-23
[20] 웹사이트 MERGE http://www.firebirds[...] 2009-09-23
[21] 웹사이트 MERGE https://www.postgres[...] 2022-10-17
[22] 웹사이트 INSERT ... ON DUPLICATE KEY UPDATE Syntax http://dev.mysql.com[...] 2014-12-08
[23] 웹사이트 REPLACE Syntax http://dev.mysql.com[...] 2014-12-08
[24] 웹사이트 INSERT https://www.postgres[...] 2019-02-08
[25] 웹사이트 INSERT http://www.sqlite.or[...] 2009-09-23
[26] 웹인용 MERGE http://otndnld.oracl[...] 2009-09-23
[27] 웹인용 MERGE 문 http://publib.boulde[...] 2009-09-23
[28] 웹인용 MERGE (Transact-SQL) http://msdn.microsof[...] 2009-09-23
[29] 웹인용 MERGE http://www.firebirds[...] 2009-09-23
[30] 웹인용 INSERT ... ON DUPLICATE KEY UPDATE 構文 http://dev.mysql.com[...] 2009-09-23
[31] 웹인용 REPLACE 構文 http://dev.mysql.com[...] 2009-09-23
[32] 웹인용 INSERT http://www.sqlite.or[...] 2009-09-23



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com