병합(SQL)
Merge (SQL)SQL을 사용하는 관계형 데이터베이스 관리 시스템 MERGE
(업서트라고도 함) 에 대한 진술INSERT
신기록 또는UPDATE
조건 일치 여부에 따라 기존 기록공식적으로 SQL:2003 표준에 도입되었고, SQL:2008 표준에 확대되었다.null
사용법
병합 INO 탭 이름 사용. table_참조 켜기 (조건) 언제 일치됨 그럼 갱신하다 세트 컬럼1 = 값1 [, column2 = value2 ...] 언제 NOT 일치됨 그럼 삽입 (컬럼1 [, column2 ...]) 가치 (값1 [, value2 ...]);
오른쪽 조인은 Target(ITUT 테이블) 및 Source(USINT 테이블/view/sub-query)를 통해 사용된다. 여기서 Target은 왼쪽 테이블이고 Source는 오른쪽 테이블이다.가능한 네 가지 조합은 다음과 같은 규칙을 산출한다.
- 소스의 ON 필드가 대상의 ON 필드와 일치하면 UPDATE
- 소스의 ON 필드가 대상의 ON 필드와 일치하지 않으면 INSERT
- ON 필드가 Source에 존재하지 않지만 Target에 존재한다면 어떠한 작업도 수행되지 않는다.
- ON 필드가 Source 또는 Target에 없는 경우 어떠한 작업도 수행되지 않는다.
여러 원본 행이 지정된 대상 행과 일치하면 SQL:2003 표준에 의해 오류가 의무화된다.MERGE 문으로 대상 행을 여러 번 업데이트할 수 없음
구현
데이터베이스 관리 시스템 Oracle Database, DB2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise 및 Apache Derby는 표준 구문을 지원한다.일부에서는 비표준 SQL 확장자를 추가하기도 한다.null
동의어
일부 데이터베이스 구현에서는 레코드가 존재하지 않거나 레코드가 이미 존재하는 경우 기존 레코드를 업데이트하는 데이터베이스 문 또는 문장의 조합에 "Uspert"(업데이트 및 삽입의 portmantau)라는 용어를 채택했다.이 동의어는 PostgreSQL (v9.5+)[1]과 SQLite (v3.24+)[2]에서 사용된다.또한 "MERGE"에 상당하는 사이비 코드를 축약하는 데도 사용된다.null
마이크로소프트 SQL Azure에서 사용된다.[3]null
기타 비표준 구현
일부 다른 데이터베이스 관리 시스템은 자체 비표준 SQL 확장을 통해 이 동작 또는 매우 유사한 동작을 지원한다.null
예를 들어 MySQL은INSERT ... ON DUPLICATE KEY UPDATE
ANSI/ISO 표준에서는 필요하지 않은 Primary KEY 또는 Unique 제약 조건에서만 대상과 소스 간의 결합이 이루어져야 한다는 제한으로 유사한 효과를 얻기 위해 사용할 수 있는 구문[4].그것은 또한 지원한다.REPLACE INTO
구문 [5]- 먼저 삽입을 시도하고, 실패한 경우 행이 있으면 삭제하고, 새 행을 삽입한다.또한 an도 있다.IGNORE
에 대한 조항INSERT
서버에게 "실행 키" 오류를 무시하고 계속 진행하도록 지시하는 문장([6]기존 행은 삽입 또는 업데이트되지 않지만 모든 새 행이 삽입됨).null
SQLite의INSERT OR REPLACE INTO
유사하게 작용하다그것은 또한 지원한다.REPLACE INTO
MySQL과의 호환성을 위한 별칭으로 사용.[7]
파이어버드 지지대MERGE INTO
그러나 소스 데이터 행이 여러 개 있을 경우 오류를 발생시키지 못한다.또한 단일 행 버전이 있다.UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]
그러나 후자는 삽입 대 업데이트에 대해 다른 작업을 수행할 수 있는 옵션을 제공하지 않는다(예: 기존 행이 아닌 새 행에 대해서만 새 시퀀스 값을 설정).null
IBM DB2는 여러 개의 구문을 확장함WHEN MATCHED
그리고WHEN NOT MATCHED
조항들, 그것들과 구별하는 조항들... AND some-condition
경비병들
Microsoft SQL Server는 가드를 지원하고 다음을 통해 왼쪽 연결 지원WHEN NOT MATCHED BY SOURCE
조항들null
PostgreSQL은 다음을 통해 병합 지원INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action
.[8]
CUBRID 지지대MERGE INTO
[9] 명세서그리고 의 사용을 지원한다.INSERT ... ON DUPLICATE KEY UPDATE
구문.[10]그것은 또한 지원한다.REPLACE INTO
MySQL과의 호환성을 위해.[11]
Apache Phoenix 지원UPSERT VALUES
[12] 그리고UPSERT SELECT
[13] 구문.null
스파크 SQL 지원UPDATE SET *
그리고INSERT *
행동 [14]조항
아파치 임팔라 지원UPSERT INTO ... SELECT
.[15]
NoSQL의 사용
유사한 개념이 일부 NoSQL 데이터베이스에 적용된다.null
예: MongoDB에서 키와 관련된 값의 필드를update
작전그update
키를 찾을 수 없는 경우 오류를 발생시킨다.에서update
작동 설정 가능upsert
플래그: 이 경우 새 값이 해당 키와 연관되어 저장되며, 그렇지 않으면 전체 값이 대체된다.null
Redis에서SET
operations는 지정된 키와 연관된 값을 설정한다.Redis는 값의 내부 구조에 대한 세부사항을 알지 못하므로 업데이트는 의미가 없을 것이다.그래서 더SET
운영에는 항상 의미론이 설정되거나 대체된다.null
참고 항목
참조
- ^ PostgreSQL-tutorial
- ^ upsert sqlite.org 6-6-2018 방문
- ^ Transact-SQL 참조(Database Engine): MERGE(Transact-SQL)
- ^ MySQL :: MySQL 5.1 참조 설명서 : 12.2.4.3 INSERT...중복된 키 업데이트 구문
- ^ MySQL 5.1 참조 설명서: 11.2.6 교체 구문
- ^ "MySQL 5.5 Reference Manual :: 13.2.5 INSERT Syntax". Retrieved 29 October 2013.
- ^ "SQL As Understood By SQLite: INSERT". Retrieved 2012-09-27.
- ^ PostgreSQL INSERT 페이지
- ^ "New CUBRID 9.0.0". CUBRID Official Blog. 2012-10-30. Retrieved 2012-11-08.
- ^ CUBRID : : 데이터 조작 문 : : 삽입 : : : 중복 KEY UPDATE 절에 ON
- ^ CUBRID :: 데이터 조작 문 :: 교체
- ^ "UPSERT VALUES".
- ^ "UPSERT SELECT".
- ^ "MERGE INTO (Delta Lake on Databricks)".
- ^ "UPSERT Statement (Apache Impala Documentation)".
- Hsu, Leo; Obe, Regina (May 18, 2008). "Cross Compare of SQL Server, MySQL, and PostgreSQL". Postgres OnLine Journal. Retrieved 8 October 2010.
- Chodorow, Kristina; Mike Dirolf (September 2010). MongoDB: The Definitive Guide. O'Reilly. ISBN 978-1-449-38156-1.